最近在看java加载so的相关内容,并写了个简单的测试程序,代码如下,但是最终没有获取到结果,不知道错误原因,现将整个的测试程序贴出,希望大家帮忙看看,谢谢。
(1)JNI:用于生成头文件的java类
package com;
public class JNIC_SO {
static {
try {
System.loadLibrary("libJNIC_SO" );
} catch (UnsatisfiedLinkError e) {
e.printStackTrace();
}
}
public native static int funMyTestAdd(int x,int y);
public native static String funMyPrintf();
}
(2)编译生成的头文件(.h)
JNIEXPORT jint JNICALL Java_com_JNIC_1SO_funMyTestAdd
(JNIEnv *, jclass, jint , jint );
/*
* Class: com_JNIC_SO
* Method: funMyPrintf
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_JNIC_1SO_funMyPrintf
(JNIEnv *, jclass);
(3)编写c程序,用于生成待调用的so文件
/*
* c_so.h
*/
#ifndef C_SO_H_
#define C_SO_H_
int funMyTestAdd(int x,int y);
char* funMyPrintf();
#endif /* C_SO_H_ */
/*
*c_so.c
*/
#include "c_so.h"
int funMyTestAdd(int x,int y){
return x+y;
}
char* funMyPrintf(){
return "This is a test for sprintting a string!";
}
/*
* libJNIC_SO.c
*/
#include "c_so.h"
#include "com_JNIC_SO.h"
#include "/opt/JDK1.7/jdk1.7.0_75/include/jni.h"
#include "/opt/JDK1.7/jdk1.7.0_75/include/jawt.h"
#include "/opt/JDK1.7/jdk1.7.0_75/include/linux/jni_md.h"
JNIEXPORT jint JNICALL Java_com_JNIC_1SO_funMyTestAdd (JNIEnv *evn, jclass obj, jint x, jint y){
//int x =0,y=0;
return funMyTestAdd(x,y);
}
JNIEXPORT jstring JNICALL Java_com_JNIC_1SO_funMyPrintf (JNIEnv *evn, jclass obj){
return funMyPrintf();//暂时先不处理
}
(4)通过命令生成SO文件
gcc -fPIC -g -shared -D_REENTRANT -I/opt/JDK1.7/jdk1.7.0_75/include -I/opt/JDK1.7/jdk1.7.0_75/include/linux -c *.c -o libJNIC_SO.so
(5)将生成的so文件拷贝至“/use/lib”目录下
(6)编写java调用SO测试程序
package com.znitech;
public class JNIMytest {
static {
System.load("/usr/lib/libJNIC_SO.so");
}
public native int funMyTestAdd(int x,int y);
public static void main(String[] args) {
JNIMytest sl = new JNIMytest();
int z = 0;
try{
z = sl.funMyTestAdd(1,2);
}catch(Exception ex){
System.out.println(ex.getMessage());
}
System.out.print("the add result:"+z);
}
}
测试程序在Eclipse下的运行结果:
Exception in thread "main" java.lang.UnsatisfiedLinkError: com.znitech.JNIMytest.funMyTestAdd(II)I
at com.znitech.JNIMytest.funMyTestAdd(Native Method)
at com.znitech.JNIMytest.main(JNIMytest.java:15)
在eclipse里面看一下你eclipse自身的LD_LIBRARY_PATH环境变量,看看该变量是否已经包含了/usr/lib
建议在.bashrc手工指定export LD_LIBRARY_PATH=/usr/lib:$LD_LIBRARY_PATH,然后重启eclipse
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。