Android – «Не удалось загрузить Foo: findLibrary возвратил null»

Я знаю, что уже есть сообщения об этой ошибке при переполнении стека, но из того, что я нашел здесь, на SO и в Google, не совпадают с моей проблемой.

Я пытаюсь запустить мое приложение, но всякий раз, когда родная функция называется моей программой, я получаю следующий LogCat

 08-01 09:15:57.448: E/AndroidRuntime(16966): FATAL EXCEPTION: main 08-01 09:15:57.448: E/AndroidRuntime(16966): java.lang.ExceptionInInitializerError 08-01 09:15:57.448: E/AndroidRuntime(16966): at my.eti.commander.MainMenu.initMain(MainMenu.java:241) 08-01 09:15:57.448: E/AndroidRuntime(16966): at my.eti.commander.MainMenu.onCreate(MainMenu.java:81) 08-01 09:15:57.448: E/AndroidRuntime(16966): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 08-01 09:15:57.448: E/AndroidRuntime(16966): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 08-01 09:15:57.448: E/AndroidRuntime(16966): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 08-01 09:15:57.448: E/AndroidRuntime(16966): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 08-01 09:15:57.448: E/AndroidRuntime(16966): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 08-01 09:15:57.448: E/AndroidRuntime(16966): at android.os.Handler.dispatchMessage(Handler.java:99) 08-01 09:15:57.448: E/AndroidRuntime(16966): at android.os.Looper.loop(Looper.java:130) 08-01 09:15:57.448: E/AndroidRuntime(16966): at android.app.ActivityThread.main(ActivityThread.java:3683) 08-01 09:15:57.448: E/AndroidRuntime(16966): at java.lang.reflect.Method.invokeNative(Native Method) 08-01 09:15:57.448: E/AndroidRuntime(16966): at java.lang.reflect.Method.invoke(Method.java:507) 08-01 09:15:57.448: E/AndroidRuntime(16966): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 08-01 09:15:57.448: E/AndroidRuntime(16966): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 08-01 09:15:57.448: E/AndroidRuntime(16966): at dalvik.system.NativeStart.main(Native Method) 08-01 09:15:57.448: E/AndroidRuntime(16966): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load RelayAPI: findLibrary returned null 08-01 09:15:57.448: E/AndroidRuntime(16966): at java.lang.Runtime.loadLibrary(Runtime.java:429) 08-01 09:15:57.448: E/AndroidRuntime(16966): at java.lang.System.loadLibrary(System.java:554) 08-01 09:15:57.448: E/AndroidRuntime(16966): at my.eti.commander.RelayAPIModel$NativeCalls.<clinit>(RelayAPIModel.java:432) 08-01 09:15:57.448: E/AndroidRuntime(16966): ... 15 more 

Вот мой файл Android.mk :

 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) EXTRA_CFLAGS := -DANDROID LOCAL_MODULE := RelayAPI LOCAL_SRC_FILES := RelayAPI.c include $(BUILD_EXECUTABLE) 

Вот изображение моей папки jni … Будет использоваться только RelayAPI, stringstuff – дополнительный файл, который не используется.

Введите описание изображения здесь

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

 public static class NativeCalls { static { System.loadLibrary( "RelayAPI"); } public native static byte InitRelayJava(); public native static void FreeRelayJava(); } 

Не следует включать $ (BUILD_SHARED_LIBRARY), а не включать $ (BUILD_EXECUTABLE)?

Ну, я получил ошибку. В прошлом месяце я задал другой вопрос, и, пытаясь решить это, эта ошибка исчезла. Это связано с установкой environment PATH variable в папку папки NDK. Это ссылка на более подробный ответ.

Обязательно создайте свою библиотеку перед запуском приложения (использующего библиотеку) с помощью ndk-build

BUILD_EXECUTABLE ошибочен, это создаст исполняемый файл (подсказка, подсказка ..) вместо общей библиотеки. Когда вы используете System.loadLibrary(..) вы должны использовать BUILD_SHARED_LIBRARY . Если он все еще не работает, может возникнуть другая ошибка, но использование BUILD_EXECUTABLE для чего-то, предназначенного для использования в качестве общей библиотеки, неверно, даже если оно «может» работать при некоторых обстоятельствах.

У меня тоже есть эта проблема, но для моей ситуации вам нужно добавить библиотеку на основе процессора в папку с вашими проектами. Если вы используете eclipse.

Введите описание изображения здесь