Android - '无法加载Foo:findLibrary返回null'

时间:2012-08-01 13:25:29

标签: android android-ndk java-native-interface

我知道关于堆栈溢出已经有关于此错误的帖子,但是我在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是一个未使用的额外文件。

enter image description here

我将所有本机函数存储在一个单独的类中,以便可以静态调用它们。这不是问题,因为我已经将它们移动了很多但我只是认为这将是我完成它的最佳方式。

public static class NativeCalls {

    static {
        System.loadLibrary( "RelayAPI");
    }

    public native static byte InitRelayJava();

    public native static void FreeRelayJava();
}

5 个答案:

答案 0 :(得分:1)

不应该包含$(BUILD_SHARED_LIBRARY)而不是include $(BUILD_EXECUTABLE)?

答案 1 :(得分:1)

好吧,我已经通过了错误。上个月我曾问过一个不同的问题,在试图解决这个问题时,这个错误就消失了。这与将environment PATH variable设置为NDK文件夹位置有关。 This is a link to a more in depth answer.

答案 2 :(得分:1)

确保在使用ndk-build

运行应用程序(使用库)之前构建库

答案 3 :(得分:0)

BUILD_EXECUTABLE错误,这将构建一个可执行文件(提示,提示..)而不是共享库。使用System.loadLibrary(..)时,您必须使用 BUILD_SHARED_LIBRARY 。如果它仍然不起作用,可能会有另一个错误,但是使用BUILD_EXECUTABLE作为共享库的东西是错误的,即使它在某些情况下可能有效。

答案 4 :(得分:0)

我也遇到过这个问题,但就我的情况而言, 您必须将基于处理器的库添加到项目libs文件夹中。 如果你正在使用eclipse。

enter image description here