2012-08-01 26 views
4

我知道已经有关于堆栈溢出的这个错误的帖子,但是从我在这里找到的所有SO和Google上都没有与我的问题对应。Android - '无法加载Foo:findLibrary返回null'

我试图运行我的应用程序,但每当一个本地函数被调用我的程序崩溃,并且我得到以下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(); 
} 
+0

我认为错误是becoz库的来临,,,,添加正确的JAR文件 – shassss 2012-08-01 13:31:33

+0

这是什么意思......? – JuiCe 2012-08-01 13:36:14

+0

将其构建为共享库。我想这可能是因为你正在将它作为一个可执行文件来构建。我不认为System.loadLibrary可以加载可执行文件 – mario 2012-08-01 13:37:02

回答

1

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

1

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

+0

刚刚尝试将它作为共享库,但没有运气。 – JuiCe 2012-08-01 13:38:39

0

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

+1

谢谢,我改变了我的部分代码。 – JuiCe 2012-08-02 14:30:59

0

我有这个问题太运行应用程序(使用库)之前,请务必建立自己的图书馆,但我的情况, 你必须基于处理器的库添加到您的项目libs文件夹。 如果你使用的是eclipse。

enter image description here

相关问题