jni 调用so库:https://blog.csdn.net/u014644574/article/details/118606177
1、简介
JNI(Java Native Interface)调用过程
那什么是JNA呢?
JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架。
2、准备so文件
创建HelloWorld.c
#include "HelloWorld.h"
JNIEXPORT void JNICALL
Java_HelloWorld_myprint(JNIEnv *env,jobject obj){
printf("Hello World !\n");
return;
}
生成HelloWorld.so文件,详细参考https://blog.csdn.net/u014644574/article/details/118606177
gcc -Wl,--add-stdcall-alias -shared -IC:\jdk1.8.0_211\include -IC:\jdk1.8.0_211\include\win32 -o HelloWorld.so HelloWorld.c
3、创建maven项目
<dependency>
<groupId>com.sun.jna</groupId>
<artifactId>jna</artifactId>
<version>3.0.9</version>
</dependency>
4、将上面生成的so文件放在项目resource文件夹下
5、准备一个类,用于解析so文件
package com.demo.so.test;
import com.sun.jna.Library;
import com.sun.jna.Native;
//继承Library,用于加载库文件
public interface Clibrary extends Library {
// [Native.synchronizedLibrary] 阻止多线程同时访问本地代码
Clibrary INSTANTCE = (Clibrary) Native.synchronizedLibrary(
(Clibrary) Native.loadLibrary(
Clibrary.class.getResource("/HelloWorld.so")
.getPath()
.substring(1)// substring(1)的原因是在Windows下获取到的路径前面会多一个斜杠,但在Linux下不会
, Clibrary.class
)
);
// 此方法为so文件中的c语言函数 Java_HelloWorld_myprint
void Java_HelloWorld_myprint();
}
6、编写测试类
package com.demo.so.test;
public class Demo {
public static void main(String[] args) {
Clibrary instance = Clibrary.INSTANTCE;
instance.Java_HelloWorld_myprint();
}
}
运行结果: