android art runtime check_jni.cc Fehler bei Paketname
- BEARBEITEN-- Ich hatte zu viele Versionen der gemeinsam genutzten Bibliothek, die wegen der mehrdeutigen build.gradle herumschwebten ...
./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
BEHOBENES Problem - Build wurde folgendermaßen geändert, sodass nur die gemeinsam genutzte Bibliothek in ./src/main/libs@ verwendet wir
sourceSets {
main {
jni.srcDirs = [] /*disable automatic ndk-build call */
jniLibs.srcDir 'src/main/libs'
}
}
Broke auf Android5 so arbeitete ich mit ihm, indem ich es für Android-Studio (1.0) ndk Build tweeking. Ich habe den Code für alle 'findClass' gescannt, wie in der Antwort @holo angegeben. Hinweis - Die Zeichenfolgenkonstante in Zeile 34 wurde von @ geänder
"fm.audioboo.jni.FLACStreamEncoder"; to "fm/audioboo/jni/FLACStreamEncoder";
Das hat nichts gelöst.
Der Java-Code ruft eine Funktion auf, und bevor diese native Funktion ausgeführt wird, sieht es so aus, als würde das Art Framework FindClass (_JNIEnv *, char const *) mit einem ungültigen Trennzeichen im 2. Argument aufrufen. Wenn Sie sich Zeile 46-48 des Pastebin-Links ansehen, sieht es nicht so aus, als würde die native Funktion jemals aufgerufen. Das Framework gibt nur den falschen Paketnamen Findclass-Fehler aus. Beachten Sie, dass die erste Zeile der nativen Funktion eine Protokollanweisung ist, die zur Laufzeit nicht erreicht wird.
Java-Ebene ...
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-Ebene ... die Funktion gelangt nie zum ersten Zeilenprotokollstatus.
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);
}
Alles funktionierte (jni build / android buid / android-java ruft cpp auf) bis android 5 build mit ndk 10-C
was ist neu in android5 / ART ist anscheinend 'check_jni.cc' und eine Art strenger Modus, der ERROR ausgibt:
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
full stacktrace: note lines 46 - 48
eim Betrachten des Protokolls sieht es so aus, als ob das Framework seinen OWN-Aufruf für 'findClass' mit dem Argument 'thisClazz' im CPP ausführt:
Java_fm_audioboo_jni_FLACStreamEncoder_init(JNIEnv * env, jobject obj, ...
und es ist ein ungültiger Argumentwert, der die Laufzeitüberprüfung von Art verletzt.
Aber ich habe 'javah' nicht ausgeführt, um Header von der Java-Oberfläche zu erstellen, da dies alles getan wurde, bevor ich das Git-Projekt bekam.
Im ratlos. Der native scheint auf die Funktion zuzugreifen, nie auf die erste Zeile in der Funktion (log statemt) und schlägt sofort auf dem @ fe
/system/lib/libart.so (art::CheckJNI::FindClass(_JNIEnv*, char const*)+66
Der ndk (R10C) hat die cpp-Klasse wie folgt verknüpft:
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 lädt die Bibliothek audioboo-native über NP wirft dann das
JNI DETECTED ERROR IN APPLICATION: illegal class name 'fm.audioboo.jni.FLACStreamEncoder''
Auf den Aufruf von Java an die native Funktion und ich habe keine Ahnung, warum?