Нет JNI_OnLoad найдено пропущение init> Закрытие приложения - программирование
Подтвердить что ты не робот

Нет JNI_OnLoad найдено пропущение init> Закрытие приложения

Люди,

Я работаю над приложением android, где мне нужна сторонняя библиотека .so. я построил эту стороннюю библиотеку (с ndk-build) в соответствии с их инструкциями и затем смотрел включить этот .so в мой проект Android.

Поэтому я выполнил шаги, описанные в docs/PREBUILTS.html, и успешно новый .so в каталоге jni/prebuilt. Теперь я попытался использовать средства .so, используя его в простом приложении для Android-приложений. Итак, что я делаю:

static {
  Log.i("load so > ","load so");
  System.loadLibrary("xyz");
   }
/* The native functions */
private static native int openFile(String filename);

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    try{
        String path =  getPathForDownloadDirectoryFile();
        Log.i("file path> ", path);
        int num= openFile(path);
    }catch(Exception e){
        Log.e(">", "could not open the file");
    }
}

Теперь, когда я запускаю свое приложение, я получаю сообщение об отладке, в котором говорится: Нет JNI_OnLoad найдено в /data/data/com.example.myfirstapp/lib/xyz.so 0x411e6738, пропуская init а затем приложение отключается.

Для получения дополнительной информации, Вот журнал ошибок:

No JNI_OnLoad found in /data/data/com.example.mysecondapp/lib/xyz.so 0x411e67a0,   skipping init
W/dalvikvm(  570): No implementation found for native    Lcom/example/mysecondapp/MainActivity;.openFile:(Ljava/lang/String;)I
D/AndroidRuntime(  570): Shutting down VM
W/dalvikvm(  570): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
E/AndroidRuntime(  570): FATAL EXCEPTION: main
E/AndroidRuntime(  570): java.lang.UnsatisfiedLinkError: Native method not found:  com.example.mysecondapp.MainActivity.openFile:(Ljava/lang/String;)I
E/AndroidRuntime(  570):    at com.example.mysecondapp.MainActivity.openFile(Native  Method)
E/AndroidRuntime(  570):    at   com.example.mysecondapp.MainActivity.onCreate(MainActivity.java:31)
E/AndroidRuntime(  570):    at android.app.Activity.performCreate(Activity.java:5008)
E/AndroidRuntime(  570):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
E/AndroidRuntime(  570):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
E/AndroidRuntime(  570):    at    android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
E/AndroidRuntime(  570):    at android.app.ActivityThread.access$600(ActivityThread.java:130)
E/AndroidRuntime(  570):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
E/AndroidRuntime(  570):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(  570):    at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(  570):    at android.app.ActivityThread.main(ActivityThread.java:4745)
E/AndroidRuntime(  570):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(  570):    at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(  570):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
E/AndroidRuntime(  570):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
E/AndroidRuntime(  570):    at dalvik.system.NativeStart.main(Native Method)
W/ActivityManager(  146):   Force finishing activity com.example.mysecondapp/.MainActivity

Как я мог видеть, что встроенная реализация метода openFile() не была найдена, но тот же xyz.so lib работал довольно аккуратно с оригинальным примером приложения от третьего лица. Я в значительной степени стартер с Android-ndk мира.

Java-Android-NDK Ninjas.. можно догадаться, чего я могу потерять? Я буду очень признателен за любую помощь здесь:)

4b9b3361

Ответ 1

Как сказал парень, "No JNI_OnLoad" - это просто предупреждение, ваша проблема кроется в другом месте.

Как вы уже упоминали, вы успешно скомпилировали ваш файл "so", проблема может заключаться в ваших сигнатурах функций внутри вашего кода c/С++, это должно быть что-то вроде этого

JNIEXPORT jint JNICALL Java_com_your_package_class_method(JNIEnv *d, jobject e, jstring f)
{
//some action

}

Подписи функций поступают из файла заголовка, который создается с помощью инструмента javah. Вам нужно сгенерировать заголовочный файл и использовать подпись функции с вашим именем пакета. Для разных имен пакетов и классов файл заголовка и соответствующая подпись функции будут изменены.

worked pretty neat with the original sample app from the third party

Это может быть причиной его запуска в примерном приложении, а не в вашем приложении.

: https://thenewcircle.com/s/post/49/using_ndk_to_call_c_code_from_android_apps

Ответ 2

Сообщение "Нет JNI_OnLoad" является просто предупреждением. JNI_OnLoad - необязательный крючок инициализации.

Я думаю, ваша проблема находится внутри метода openFile(). Попробуйте прокомментировать вызов с Java и посмотрите, как далеко вы получите.

У меня есть сообщение в блоге о JNI и некоторый пример кода на http://guycole.blogspot.com/2012/03/yet-another-android-ndk-blog-posting.html - возможно, вы найдете его полезным.

Удачи.

Ответ 3

Он также поставляется с этим журналом

?? -????:??:??.???: INFO/(): java.lang.UnsatisfiedLinkError: Не удалось загрузить *: findLibrary возвратил null

правый??

Я думаю, что это проблема файлов android.mk. 1: попытайтесь смириться с armabi v7. 2: load funciton вызовет open(). проверьте разрешение так.

Ответ 4

Как упоминалось в предыдущих ответах, No JNI_OnLoad является только предупреждением.

У меня была схожая проблема, я понял, что проблема связана с файловыми операциями.

В моем приложении не было разрешения на запись на внешнее хранилище. После добавления приведенного ниже кода в манифест, что он отлично работает