没有JNI_OnLoad发现跳过init>应用程序关闭

时间:2012-09-27 16:35:20

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

民间,

我正在开发一个Android应用程序,我需要第三方.so库。我建造了 这个第三方库(使用ndk-build)按照他们的指示,然后看 将此.so包含在我的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");
    }
}

现在当我运行我的应用程序时,我收到一条调试消息说: 在/data/data/com.example.myfirstapp/lib/xyz.so 0x411e6738中找不到JNI_OnLoad,跳过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 Ninjas ..我猜错了什么? 我非常感谢这里的任何帮助:)

4 个答案:

答案 0 :(得分:17)

正如guycole所说“No JNI_OnLoad”只是一个警告,你的问题就在别处。

正如您所提到的,您成功编译了“so”文件,问题可能在于您的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

答案 1 :(得分:6)

“No JNI_OnLoad”消息只是一个警告。 JNI_OnLoad是一个可选的初始化挂钩。

我猜你的问题在openFile()方法中。尝试用Java注释掉这个调用,看看你能走多远。

我有一篇关于JNI的博客文章和http://guycole.blogspot.com/2012/03/yet-another-android-ndk-blog-posting.html的一些示例代码 - 也许你会发现它很有用。

祝你好运。

答案 2 :(得分:2)

它还附带此日志

  

?? - ?? ??:??:??。???:INFO /():java.lang.UnsatisfiedLinkError:无法加载 * :findLibrary返回null

右??

我认为这是android.mk文件的问题。 1:试着转向armabi v7。 2:load funciton将调用open()。检查所以的许可。

答案 3 :(得分:0)

如前面的答案所述,No JNI_OnLoad只是一个警告。

我有类似的问题,我认为问题是因为文件操作。

我的应用没有外部存储写入权限。添加以下代码后 表明它工作正常