-
JNA以及开发环境介绍
- 介绍
- JNA 是基于JNI的, 用于在Java层调用C的代码
- JNA和JNI的对比
- JNA不需要特意为C编写代码 ,所有操作在Java端完成
- JNI需要C的代码包含jni.h头文件 并且按照JNI的格式编写
- JNA不需要特意为C编写代码 ,所有操作在Java端完成
- 本教程的C语言使用Makefile 在Linux下编译完成 生成so文件
- 读者如果使用Windows那么可以使用VS编译测试C代码 生成dll文件
- 介绍
-
准备C代码
-
#include <stdio.h> int add(int x,int y){ printf("%d\n",x+y); return x + y; } void testString(const char *str){ printf("%s\n",str); } int test_callback(int(*f)(int x,int y)){ int x = f(3,4); printf("callback :%d\n",x); return x; }
-
编译见Makefile
-
-
JNA之普通函数调用
-
获取so文件实例对象 以及声明so文件中有哪些函数
-
package com.example; import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.*; public interface JnaTest extends Library{ JnaTest INSTANCE = Native.load("main",JnaTest.class); int add(int x,int y); void testString(String x); }
-
-
调用
-
package com.example; public class Main { public static void main( String[] args ) { //测试普通调用 JnaTest.INSTANCE.add(2, 3); JnaTest.INSTANCE.testString("helloworld"); } }
-
-
-
JNA之回调函数
-
导入so 以及声明使用回调函数的函数
-
package com.example; import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.*; public interface JnaTest extends Library{ //导入so 在$LD_LIBRARY_PATH寻找 JnaTest INSTANCE = Native.load("main",JnaTest.class); int add(int x,int y); void testString(String x); //声明底层有一个名为test_callback的函数 他的参数是一个回调函数 int test_callback(addCallback f); int test_callback(multiplyCallback f); //实现接口的目的是 将Java的方法通过JNA转换为C的函数指针 //声明回调函数 public interface myCallback extends Callback{ //这个接口里只能有一个public 方法 public int callback(int x,int y); } //实现回调函数 加法 public static class addCallback implements myCallback{ @Override public int callback(int x,int y){ return x + y; } } //实现回调函数 乘法 public static class multiplyCallback implements myCallback{ @Override public int callback(int x,int y){ return x * y; } } }
-
调用
-
package com.example; public class Main { public static void main( String[] args ) { //测试回调 分别传入不同的回调函数 JnaTest.INSTANCE.test_callback(new JnaTest.addCallback()); JnaTest.INSTANCE.test_callback(new JnaTest.multiplyCallback()); } }
-
-
-
-
其他注意事项
-
在Linux下 so库库可以由LD_LIBRARY_PATH环境变量设置 , 比如。
-
#在项目根目录下执行 export LD_LIBRARY_PATH=`pwd`/src/main/java/com/example
-
顺便说一下当然也可ldconfig /系统标准库目录
-
-
在windows下只要把dll 和java放在一个目录下即可 不需要设置环境变量
-
JNA回调 Java C语言
最新推荐文章于 2023-12-15 16:55:29 发布