Сбой собственного кода Android - PullRequest
2 голосов
/ 11 сентября 2011

У меня есть тестовый случай, когда java вызывает простую подпрограмму в C с парой аргументов, и она возвращает строку, и она работает.

Однако, когда я кодировал свой реальный код таким же образом, онпадает с «Исключением целевой задачи».Затем я упростил его до простого вызова и возврата строки, и она все еще вылетает.

Разница между этими двумя случаями состоит в том, что один из вызовов имеет 6 аргументов с плавающей запятой, а другой - 14 плавающихАРС.Сначала вызывается шестизначный аргумент (настройка), и я получаю исключение.

Есть ли практическое ограничение на число аргументов, которые могут быть при вызове нативного кода?Или я должен продолжить поиск своего кода для проблемы в другом месте?

Извините - я не смог заставить logcat отформатировать как комментарий, поэтому я вместо этого публикую его как редактирование.Вот logcat, любое предложение, где я должен посмотреть?Что означает «реализация не найдена»?

D/dalvikvm(  531): Added shared lib /data/data/com.kinyur.etold/lib/libgalib.so 0x405133e0
D/dalvikvm(  531): No JNI_OnLoad found in /data/data/com.kinyur.etold/lib/libgalib.so 0x405133e0, skipping init
W/dalvikvm(  531): No implementation found for native Lcom/kinyur/etold/NativeLib;.setup (FFFFFF)Ljava/lang/String;
D/AndroidRuntime(  531): Shutting down VM
W/dalvikvm(  531): threadid=1: thread exiting with uncaught exception (group=0x40015560)
E/AndroidRuntime(  531): FATAL EXCEPTION: main

Процедура вызывается с 6 числами с плавающей запятой и возвращает тип String.А «setup» - это имя подпрограммы, которую я вызывал в случае сбоя.

Ответы [ 2 ]

2 голосов
/ 11 сентября 2011

Я не знаю каких-либо ограничений количества аргументов метода JNI

1 голос
/ 12 сентября 2011

Извините за отвлечение, я потратил на это целый день и обнаружил, что проблема была просто глупой опечаткой с моей стороны, возможно, проблемой копирования и вставки.

Интересно также, что я защитил собственный вызов с помощью блока 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);
...