android art runtime check_jni.cc ошибка в имени пакета

--EDIT-- у меня было слишком много версий разделяемой библиотеки, плавающей вокруг из-за неоднозначного build.gradle ...

./src/main/jniLibs/armeabi-v7a/libaudioboo-native.so
rob@ app$ rm ./src/main/libs/armeabi-v7a/libaudioboo-native.so
rob@ app$ rm ./src/main/obj/local/armeabi-v7a/libaudioboo-native.so
rob@ app$ rm ./src/main/jniLibs/armeabi-v7a/libaudioboo-native.so 

Решена проблема - изменена сборка на следующую, чтобы использовать только общую библиотеку в ./src/main/libs

sourceSets {
    main {
        jni.srcDirs = [] /*disable automatic ndk-build call */
        jniLibs.srcDir 'src/main/libs'
    }
}

Сломался на android5, так что я работал с ним, настроив его для Android-студии (1.0) ndk build. Я отсканировал код для всех 'findClass', как указано в ответе @holo. Примечание. Изменена строковая константа в строке 34 с

 "fm.audioboo.jni.FLACStreamEncoder"; to "fm/audioboo/jni/FLACStreamEncoder";

Это ничего не решило.

Java-код вызывает функцию, и перед тем, как эта нативная функция выполняется, она выглядит так, как если бы сама арт-среда вызывала FindClass (_JNIEnv *, char const *), используя плохой разделитель символов во 2-м аргументе. Если вы посмотрите на строку 46-48 ссылки pastebin, то не похоже, что нативная функция когда-либо вызывается. Фреймворк просто выбрасывает неверное имя пакета Findclass error. Обратите внимание, что первая строка встроенной функции - это оператор журнала, который не достигается во время выполнения.

Слой Java ...

  public FLACStreamEncoder(String outfile, int sample_rate, int channels,
      int bits_per_sample)
  {
    init(outfile, sample_rate, channels, bits_per_sample);
  }

...
  native private void init(String outfile, int sample_rate, int channels,
      int bits_per_sample);

...
  static {
    System.loadLibrary("audioboo-native");
  }

Слой CPP ... функция никогда не попадает в первую строку журнала stmt.

extern "C" {

void
Java_fm_audioboo_jni_FLACStreamEncoder_init(JNIEnv * env, jobject obj,
    jstring outfile, jint sample_rate, jint channels, jint bits_per_sample)
{
    aj::log(ANDROID_LOG_DEBUG, LTAG, "Begin INIT extern call");
  assert(sizeof(jlong) >= sizeof(FLACStreamEncoder *));

  FLACStreamEncoder * encoder = new FLACStreamEncoder(
      aj::convert_jstring_path(env, outfile), sample_rate, channels,
      bits_per_sample);

  char const * const error = encoder->init();
  if (NULL != error) {
    delete encoder;

    aj::throwByName(env, IllegalArgumentException_classname, error);
    return;
  }

  set_encoder(env, obj, encoder);
}

Все работало (сборка jni / сборка android / вызовы android-java в cpp) вплоть до сборки Android 5 с использованием ndk 10-C

что нового в android5 / ART выглядит как 'check_jni.cc' и какой-то строгий режим, дающий ОШИБКУ:

D/FLACRecorder(26743): Setting up encoder /data/data/com.borneo.speech/files/20141123081747.flac rate: 22050 channels: 1 format 16
F/art     (26743): art/runtime/check_jni.cc:65] JNI DETECTED ERROR IN APPLICATION: illegal class name 'fm.audioboo.jni.FLACStreamEncoder'
F/art     (26743): art/runtime/check_jni.cc:65]     (should be of the form 'package/Class', [Lpackage/Class;' or '[[B')
F/art     (26743): art/runtime/check_jni.cc:65]     in call to FindClass
F/art     (26743): art/runtime/check_jni.cc:65]     from void fm.audioboo.jni.FLACStreamEncoder.init(java.lang.String, int, int, int)
F

полная трассировка стека: ноты 46 - 48

Глядя на журнал, создается впечатление, что фреймворк выполняет свой собственный вызов findClass, используя 2-й аргумент thisClazz в CPP:

Java_fm_audioboo_jni_FLACStreamEncoder_init(JNIEnv * env, jobject obj, ...  

и его плохое значение arg нарушает проверку времени выполнения искусства.

Но я не запускал 'javah' для создания каких-либо заголовков из интерфейса java, потому что все это было сделано до того, как я получил проект git.

Я в тупике. Натив, кажется, попадает в функцию, никогда не попадая на первую строку в функции (log statemt), сразу же завершается с ошибкой

 /system/lib/libart.so (art::CheckJNI::FindClass(_JNIEnv*, char const*)+66

Ndk (R10C) связал класс cpp следующим образом:

make: Entering directory `/home/rob/tmp/audioboo-android/app/src/main/jni'
[armeabi-v7a] Compile thumb  : audioboo-ogg <= bitwise.c
[armeabi-v7a] Compile thumb  : audioboo-ogg <= framing.c
[armeabi-v7a] StaticLibrary  : libaudioboo-ogg.a
[armeabi-v7a] Compile thumb  : audioboo-flac <= bitmath.c
[armeabi-v7a] Compile thumb  : audioboo-flac <= bitreader.c
[armeabi-v7a] Compile thumb  : audioboo-flac <= cpu.c
[armeabi-v7a] Compile thumb  : audioboo-flac <= crc.c
[armeabi-v7a] Compile thumb  : audioboo-flac <= fixed.c
[armeabi-v7a] Compile thumb  : audioboo-flac <= float.c
[armeabi-v7a] Compile thumb  : audioboo-flac <= format.c
[armeabi-v7a] Compile thumb  : audioboo-flac <= lpc.c
[armeabi-v7a] Compile thumb  : audioboo-flac <= md5.c
[armeabi-v7a] Compile thumb  : audioboo-flac <= memory.c
[armeabi-v7a] Compile thumb  : audioboo-flac <= metadata_iterators.c
[armeabi-v7a] Compile thumb  : audioboo-flac <= metadata_object.c
[armeabi-v7a] Compile thumb  : audioboo-flac <= ogg_decoder_aspect.c
[armeabi-v7a] Compile thumb  : audioboo-flac <= ogg_encoder_aspect.c
[armeabi-v7a] Compile thumb  : audioboo-flac <= ogg_helper.c
[armeabi-v7a] Compile thumb  : audioboo-flac <= ogg_mapping.c
[armeabi-v7a] Compile thumb  : audioboo-flac <= stream_decoder.c
[armeabi-v7a] Compile thumb  : audioboo-flac <= stream_encoder.c
[armeabi-v7a] Compile thumb  : audioboo-flac <= stream_encoder_framing.c
[armeabi-v7a] Compile thumb  : audioboo-flac <= window.c
[armeabi-v7a] Compile thumb  : audioboo-flac <= bitwriter.c
[armeabi-v7a] StaticLibrary  : libaudioboo-flac.a
[armeabi-v7a] Compile++ thumb: audioboo-native <= FLACStreamEncoder.cpp
[armeabi-v7a] Compile++ thumb: audioboo-native <= FLACStreamDecoder.cpp
[armeabi-v7a] Compile++ thumb: audioboo-native <= util.cpp
[armeabi-v7a] StaticLibrary  : libstdc++.a
[armeabi-v7a] SharedLibrary  : libaudioboo-native.so
[armeabi-v7a] Install        : libaudioboo-native.so => libs/armeabi-v7a/libaudioboo-native.so
make: Leaving directory `/home/rob/tmp/audioboo-android/app/src/main/jni'

Android загружает библиотекуaudioboo родной выше NP затем бросает

JNI DETECTED ERROR IN APPLICATION: illegal class name 'fm.audioboo.jni.FLACStreamEncoder''

на вызов из Java в нативную функцию, и я понятия не имею, почему?

Ответы на вопрос(1)

Ваш ответ на вопрос