如何在Android中解决NDK中的java.lang.UnsatisfiedLinkError?

Ind*_*mar 25 android-ndk

我是android中的ndk开发新手.我已经完成了ndk android的文件系统.在这里,解释我做了什么.1)我创建了一个名为"jni"的文件夹,然后创建了名为Android.mk和ndkfoo.c的2个文件.

在Android.mk中

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# Here we give our module name and source file(s)
LOCAL_MODULE    := ndkfoo
LOCAL_SRC_FILES := ndkfoo.c

include $(BUILD_SHARED_LIBRARY)
Run Code Online (Sandbox Code Playgroud)

在ndkfoo.c中

#include <string.h>
#include <jni.h>

jstring Java_com_mindtherobot_samples_ndkfoo_NdkFooActivity_invokeNativeFunction(JNIEnv* env, jobject javaThis) {
 return (*env)->NewStringUTF(env, "Hello from native code!");
}
Run Code Online (Sandbox Code Playgroud)

然后我创建了NdkFooActivity类,我写了

// load the library - name matches jni/Android.mk
 static {
  System.loadLibrary("ndkfoo");
 }
Run Code Online (Sandbox Code Playgroud)

但是现在当我在xp中使用cygwin构建它成功创建.so文件然后我作为android应用程序运行.它给了我LOGCAT中的java.lang.UnsatisfiedLinkError.

所以,请让我知道我错在哪里.

提前致谢,

Sta*_*ust 22

我想你忘了更改包名.

Java_com_mindtherobot_samples_ndkfoo

它应该是您指定的创建项目的包.


Dan*_*uez 21

另外(刚遇到此问题),请注意,如果您在Intel Atom x86仿真器上进行测试,System.loadLibrary()将始终抛出异常.它适用于常规Android模拟器和物理设备上的调试.

  • 试错了.为了给你这个答案,很多调试时间丢失了. (7认同)
  • 值得注意的是,通过编译所有体系结构可以解决此问题,如http://stackoverflow.com/a/12607739/2264920所示. (3认同)
  • @Daniel Rodriguez:非常感谢soooooooooo.:) :) :) :) (2认同)

184*_*615 11

虽然这不是OP的问题,但由于缺少,我有相同的java.lang.UnsatisfiedLinkError

static {
    System.loadLibrary("mylibraryname");
}
Run Code Online (Sandbox Code Playgroud)


Som*_*Tim 5

正如其他人所提到的,签名错误的可能性很大.

如果运行javah实用程序,则可以找到确切的签名.从项目中的bin文件夹(生成.apk)和生成Java类层次结构的根目录开始,运行:

javah -o jni_sig.h com.mindtherobot.whatever.your.package.is.NdkFooActivity

...并且,如果您的包名和类名正确,它将为任何本机函数写出一个带有正确函数签名的标头(称为jni_sig.h).将其复制到标题和.c文件,根据需要添加参数,它应该正常工作.