java jna调用so动态链接库详细步骤

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();
	}

}

运行结果:

猜你喜欢

转载自blog.csdn.net/u014644574/article/details/118608423
今日推荐