Linux中关于JAVA调用C生成的.so动态链接库

时间:2021-09-03 07:10:30

第一步.首先,我们先写个JAVA类:

public class HelloJNI { 

static { 

System.loadLibrary("HelloWorld");  //链接库的名字

} 

public native static void setNum(int num);  //链接库的方法

public native static int get();//链接库的方法

public static void main(String[] args) { 

    HelloJNI test = new HelloJNI(); 

    test.setNum(666); 
        System.out.println(test.get());
       }
}

第二步.进行编译: javac HelloJNI.java
第三步.再编译生成.h文件: javah -jni HelloJNI

Linux中关于JAVA调用C生成的.so动态链接库
上图为生成的.h文件。可以看出我们在JAVA类中写的native方法到了这里面来。
第四步. 编写C代码 文件命名为HelloWorld.c跟前面加载链接库相对应 .

#include "HelloJNI.h"
int result=888; 
//注:JAVA的类型跟C的类型转换 可以用JNI来操作
//有点类似继承的样子 
JNIEXPORT void JNICALL Java_HelloJNI_setNum
  (JNIEnv * env, jclass jc, jint num){
    result+=num; 

  }

  JNIEXPORT jint JNICALL Java_HelloJNI_get
  (JNIEnv * env, jclass jc){
    return result;

  }

第五步. 生成.o文件 再生成.so文件
gcc -c -fPIC -o HelloWorld.o HelloWorld.c //生成.o
gcc -shared -o libHelloWorld.so HelloWorld.o //生成.so 这里一定要注意用lib开头这样才可以系统才可以找到。如果不加lib 不能找到该文件

第六步. 再让动态链接库输出可用
sudo ldconfig
第七步. 把.so文件放到JAVA.library.path中
可以用新写个方法 :
System.out.println(System.getProperty(“java.library.path”));
输出库的路径。放到其中就可以
第八步 便可以运行JAVA: java HelloJNI
得到结果 1554