JNI调用native方法出现 java.lang.UnsatisfiedLinkError: XXXclass.XXXmethod()异常的解决办法

http://blog.csdn.net/hap_gx/article/details/9626841

昨天拿到JNI的Android工程Demo,然后把demo整合到开发的主线工程上,发现调用JNI方法一直抛同一个异常

java.lang.UnsatisfiedLinkError: XXXclass.XXXmethod()

我以为是JNI的so库有问题,但是demo运行时正常的,我无法找到原因的所在。我可以确认的我自己的问题,今天上午问到另外一个写C的同事,向他描述了我的情况。然后他问我是不是包名不一致的原因,我恍然大悟。确实在我移植到主线上的工程时,将定于调用JNI的包名改掉了。而so库在编译的时候,是有指定调用的包名的,这个就可以解释为何demo运行正常。只需要保证android工程调用JNI的包名与so库定义的包名类名方法名一致就可以了。

下面简单介绍一下JNI的 .h文件的内容

[java] view plain copy
  1. #ifndef _Included_packagename_classname   //packagename 指的是android工程中的包名 classname指的是android工程中定义JNI的类,该类包含调用JNI的方法  
  2. #define _Included_packagename_classname  
  3. #ifdef __cplusplus  
  4. extern "C" {  
  5. #endif  
  6. /* 
  7.  * Class:     <span style="font-family: Arial, Helvetica, sans-serif;">packagename_classname</span> 
  8.  * Method:    methodName 
  9.  */  
  10. JNIEXPORT jint JNICALL Java_packagename_classname_methodname();  // jint 指的返回数据类型为int,JNICALL 后面指定了调用JNI方法的包名和类名、方法名<span style="font-family: Arial, Helvetica, sans-serif;">...</span>  
JNI的 .c文件格式如下

[java] view plain copy
  1. #include "<span style="font-family: Arial, Helvetica, sans-serif;">packagename_classname</span><span style="font-family: Arial, Helvetica, sans-serif;">.h"  // 这个是指的定义.h文件的命名,必须与.h文件的命名一致</span>  
  2. #include <stdio.h>  
  3.   
  4. #include "../../../src/classname.h"  // 包含src目录下定义的.h文件  
  5.   
  6. #include <android/log.h>  
  7. static char *tag = "logtag_jni"// 定义打印log的标签  
  8.   
  9. #define LOGI(...) __android_log_print(ANDROID_LOG_INFO   , tag, __VA_ARGS__)  
  10. #define LOGW(...) __android_log_print(ANDROID_LOG_WARN   , tag, __VA_ARGS__)  
  11. #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR  , tag, __VA_ARGS__)  
  12. #define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, tag, __VA_ARGS__)  
  13. #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG  , tag, __VA_ARGS__)  
  14.   
  15. /* 
  16.  * Class:     <span style="font-family: Arial, Helvetica, sans-serif;">packagename_classname</span> 
  17.  * Method:    methodName 
  18.  */  
  19. JNIEXPORT jint JNICALL Java_<span style="font-family: Arial, Helvetica, sans-serif;">packagename_classname_methodName</span>(){...}  
  20.   
  21. ......  
  22. }  

了解这些,帮助理解JNI就容易多了
阅读更多
个人分类: java
上一篇linux系统调用和库函数调用的区别
下一篇Linux 上实现双向进程间通信管道
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭