Извините за отвлечение, я потратил на это целый день и обнаружил, что проблема была просто глупой опечаткой с моей стороны, возможно, проблемой копирования и вставки.
Интересно также, что я защитил собственный вызов с помощью блока try ... catch, но программа все равно не работала, вместо исключения.
У меня было две проблемы. Первый основной был:
Неправильно указано оформленное имя подпрограммы в моем файле .C. В моем тестовом примере, который работал, я использовал:
JNIEXPORT jstring JNICALL Java_com_example_atest_NativeLib_hello
и в моем реальном случае я хотел:
JNIEXPORT jstring JNICALL Java_com_kinyur_etold_NativeLib_doSetup
но у меня было:
JNIEXPORT jstring JNICALL Java_com_example_atest_NativeLib_doSetup
так что у меня осталась куча с того момента, когда я скопировал футляр, который работал в новый. Я не знаю, сколько раз я смотрел на это сегодня и не замечал этого. : - (
И что интересно, согласно logcat, он, казалось, связывался с библиотекой в порядке и не работал, когда работал (используя подпрограмму «hello» вместо «doSetup»):
D/dalvikvm( 460): Trying to load lib /data/data/com.kinyur.etold/lib/libgalib.so 0x40515840
D/dalvikvm( 460): Added shared lib /data/data/com.kinyur.etold/lib/libgalib.so0x40515840
D/dalvikvm( 460): No JNI_OnLoad found in /data/data/com.kinyur.etold/lib/libgalib.so 0x40515840, skipping init
W/dalvikvm( 460): No implementation found for native Lcom/kinyur/etold/NativeLib;.hello ()Ljava/lang/String;
D/AndroidRuntime( 460): Shutting down VM
W/dalvikvm( 460): threadid=1: thread exiting with uncaught exception (group=0x40015560)
E/AndroidRuntime( 460): FATAL EXCEPTION: main
E/AndroidRuntime( 460): java.lang.UnsatisfiedLinkError: hello
E/AndroidRuntime( 460): at com.kinyur.etold.NativeLib.hello(Native Method)
E/AndroidRuntime( 460): at com.kinyur.etold.ComFields.<init>(ComFields.java:33)
E/AndroidRuntime( 460): at com.kinyur.etold.EtMain.onCreate(EtMain.java:28)
E/AndroidRuntime( 460): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
ВТОРОЙ проблемой, которую я обнаружил во время поиска первой, было то, что я неправильно возвращал строку в подпрограмме C.
У меня было:
char* aString = "1234";
return aString;
Что нужно было:
return (*env)->NewStringUTF(env, aString);