2012-08-01 69 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

相關問題