【问题标题】:No JNI_OnLoad found skipping init > Application shutdown没有找到 JNI_OnLoad 跳过初始化 > 应用程序关闭
【发布时间】:2012-09-19 12:22:30
【问题描述】:

伙计们,

我正在开发一个需要第三方 .so 库的 android 应用程序。我盖了 这个第三方库(带有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,跳过初始化 然后应用程序关闭。

更多信息,这里是错误日志:

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 库与来自第三方的原始示例应用程序配合得非常好。我几乎是 Android-ndk 世界的初学者。

Java-Android-NDK Ninjas ..猜猜我可能会错过什么? 我将非常感谢这里的任何帮助:)

【问题讨论】:

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


    【解决方案1】:

    正如 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

    【讨论】:

    • 对!包名可能是原因!让我用适当的包装试一试。到时会回复你的,谢谢!
    • 我用我自己的新包结构构建 .so,但现在我在设备上安装 apk 时遇到了 Failure [INSTALL_FAILED_MISSING_SHARED_LIBRARY] 错误,尽管 xyz.so 存在于 Project_folder 下/libs/arm_folder 。知道这背后可能是什么吗?
    • 粘贴你的make文件并尝试运行链接中给出的例子,你会得到一些清晰的。
    • 它应该在 Project_folder/libs/armrabi 中。您也可以使用 WinRAR 或其他解压工具打开 .apk 文件,查看其中包含哪些 .so 文件。
    • 我搞砸了我的 AndroidManifest 文件,因此出现了错误!现在一切正常。谢谢大家:)
    【解决方案2】:

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

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

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

    祝你好运。

    【讨论】:

    • 谢谢盖科尔!你的文章确实很全面。
    • 没错。你的博文也做得很好。很好的接触,为 Java 中的 JNI 回调提供源代码。
    【解决方案3】:

    这个日志也自带

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

    对吗??

    我认为是 android.mk 文件的问题。 1:尝试切换到armabi v7。 2:加载函数会调用open()。检查so的权限。

    【讨论】:

      【解决方案4】:

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

      我遇到过类似的问题,我认为问题是由于文件操作造成的。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多