JNA简单范例

Posted 柳鲲鹏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JNA简单范例相关的知识,希望对你有一定的参考价值。

  • C头文件
#ifndef __JNATEST_H__
#define __JNATEST_H__

#define LOG_HERE() printf("%s-%d\\n", __func__, __LINE__)

void test_jna();

#endif
  • C代码
#include <stdio.h>
#include "jnatest.h"
 
void test_jna()

    LOG_HERE();
    printf("called from JAVA\\n");

  • JAVA代码
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
 
public class JnaTest

	//继承Library,用于加载库文件  
	public interface CLibrary extends Library
    
		CLibrary INSTANCE = (CLibrary) Native.loadLibrary(
            (Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class);
 
		// 声明一个跟C语言的printf()一样的方法,
		void printf(String format, Object... args);
	 
	
	public interface TestLibrary extends Library
    
		TestLibrary INSTANCE = (TestLibrary) Native.loadLibrary("jnatest", TestLibrary.class);
 
        void test_jna();
	 


	public static void main(String[] args)
    
		//调用  
		CLibrary.INSTANCE.printf("From JAVA To C, year=%d\\n", 2022);
        TestLibrary.INSTANCE.test_jna();
	

  • 安装依赖库
sudo apt install -y openjdk-8-jdk
sudo apt install -y libjna-java
sudo apt install -y libjna-platform-java
  • 编译

gcc -fPIC -shared -o libjnatest.so jnatest.c
sudo ldconfig

javac -extdirs /usr/share/java JnaTest.java
  • 测试
USJ_DIR=/usr/share/java
CLASS_DIRS=.
CLASS_DIRS=$CLASS_DIRS:$USJ_DIR/jna.jar
CLASS_DIRS=$CLASS_DIRS:$USJ_DIR/jna-platform.jar

java  \\
    -cp $CLASS_DIRS \\
    JnaTest

以上是关于JNA简单范例的主要内容,如果未能解决你的问题,请参考以下文章

Atitit.java jna  调用c  c++ dll的原理与实践  总结  v2 &

JNA调用DLL简单使用

使用 POSIX 消息队列运行 JNA 示例

Linux下JNA 调用 so 库

Java跨语言调用,使用JNA访问Java外部接口

java高级用法之:JNA中的回调