找不到JNI_OnLoad

时间:2011-02-07 12:22:56

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

我启动了android应用程序开发并遵循了本教程:

http://mindtherobot.com/blog/452/android-beginners-ndk-setup-step-by-step/  但申请没有奏效。 我调试它,日志猫显示此消息: 找不到JNI_Onload ..我可以解决这个问题吗?

由于

2 个答案:

答案 0 :(得分:9)

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

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

您只需从静态类初始化程序中加载本机库,如下所示:

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

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

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

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

答案 1 :(得分:4)

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

它就在那里,因为人们偶尔会在没有'extern“C”'声明的情况下编写JNI_OnLoad,然后不确定为什么事情不起作用。

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

你应该将其中的一部分粘贴到一个问题中,并且可能更详细地描述失败(“不起作用”有点模糊)。