2012-09-27 41 views
14

夥計們,沒有JNI_OnLoad發現逃課的init>應用程序關閉

我在Android應用程序,我需要一個第三方.so庫工作。我內置 這個第三方庫(與NDK建造),按照他們的指示,然後尋找 包括在我的Android項目這個。所以。

因此,我遵循docs/PREBUILTS.html中描述的步驟,並在jni/prebuilt目錄中成功構建了 新的.so。現在我嘗試在一個簡單的測試android應用程序中使用.so設施。所以,我做的是:

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忍者..any想什麼我可能會丟失? 我非常欣賞這裏的任何幫助:)

回答

16

正如guycole說:「不JNI_OnLoad」只是一個警告,您的問題不在於此。

至於你提到你成功編譯你的「這樣」的文件,問題可能在於你的函數簽名的C/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

+0

對!包名可能是原因!讓我試用適當的包裝。我們會盡快回復你,謝謝! –

+0

我用新的包裝結構構建.so,這是我自己的,但現在我在安裝設備上的apk時出現Failure [INSTALL_FAILED_MISSING_SHARED_LIBRARY]錯誤,儘管xyz.so存在於Project_folder/libs/arm_folder下。任何想法可能背後是什麼? –

+0

粘貼你的make文件,並嘗試運行鏈接中給出的例子,你會得到一些清晰。 –

6

「無JNI_OnLoad」的消息只是一個警告。 JNI_OnLoad是一個可選的初始化鉤子。

我猜你的問題是中openFile()方法中。嘗試評論來自Java的調用,看看你有多遠。

我有一個博客帖子大約JNI和http://guycole.blogspot.com/2012/03/yet-another-android-ndk-blog-posting.html一些示例代碼 - 也許你會發現它是有用的。

祝你好運。

+0

感謝guycole!你的文章確實很全面。 –

+0

沒錯。你的博客文章也做得很好。 Nice touch爲Java中的JNI回調提供源代碼。 –

2

它還配備了這篇日誌

??-?? ??:??:??.???: INFO/(): java.lang.UnsatisfiedLinkError: Couldn't load *: findLibrary returned null

吧??

我認爲這是android.mk文件的問題。 1:嘗試開啓armabi v7。 2:加載函數將調用open()。如此檢查許可。

0

正如在前面的答案中所提到的,沒有JNI_OnLoad只是一個警告。

我有類似的問題,我想這個問題是因爲文件操作。

我的應用程序是沒有外部存儲寫入permission.After在 添加下面的代碼清單它是工作的罰款