【问题标题】:JNI_OnLoad not found未找到 JNI_OnLoad
【发布时间】:2011-06-22 17:10:40
【问题描述】:

我开始了 android 应用程序开发并遵循了这个教程:

http://mindtherobot.com/blog/452/android-beginners-ndk-setup-step-by-step/ 但应用程序不起作用。 我调试它并且日志猫显示此消息: JNI_Onload not found..我该如何解决这个问题?

谢谢

【问题讨论】:

    标签: android android-ndk android-ndk-r5


    【解决方案1】:

    JNI_OnLoad 函数的主要目的是注册您的所有本机方法。

    这是推荐的,但不是唯一的方法。因此提供 JNI_OnLoad 函数是可选的。因为它用于注册所有本地方法,所以它可以在方法实际使用之前发现 java 本地方法声明与其对应的 C/C++ 方法之间的签名不匹配。

    您可以改为从静态类初始化器中加载本机库,如下所示:

    static {
        System.loadLibrary("mylib");
    }
    

    这样,您不必提供 JNI_OnLoad 函数,并且会自动发现“mylib”中的所有本机方法。唯一的缺点是,在您实际调用它之前,您不会知道您的某些本机方法签名是否错误。在这种情况下,您会收到“unsatisfiedlinkerror”,告诉您没有找到您尝试调用的本机方法的实现。

    如果您选择此选项(选项 2 - 自动发现),调试级别消息将只是一个警告,告诉您您“忘记”提供 JNI_OnLoad 函数,因此您可以忽略它

    有关更多信息,请查看 JNI 提示:
    http://developer.android.com/guide/practices/jni.html

    【讨论】:

      【解决方案2】:

      JNI_OnLoad 是一个调试级消息,它只是让您知道未找到该函数。

      之所以存在,是因为人们偶尔会在没有“extern "C"' 声明的情况下编写 JNI_OnLoad,然后不确定为什么事情不起作用。

      您面临的问题可能与消息无关。查看附近的 logcat 输出以获取线索。 dlopen() 失败和 Java 异常可能是相关的。

      您应该将其中的一些内容粘贴到问题中,并可能更详细地描述失败(“不起作用”有点含糊)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-19
        • 1970-01-01
        • 1970-01-01
        • 2016-07-24
        • 2012-08-31
        相关资源
        最近更新 更多