Java调用C/C++编写的动态连接库-JNI

4 篇文章 0 订阅
1 篇文章 0 订阅

同学写个项目,需要用Java调用C++写好的socket,我帮下忙。

 

用Java写好一个类,声明一定的类方法。注意是声明,比如

 

其中的native关键字表明是链接到外部dll的方法,同时也在外部定义。

然后在类内部加上装载库文件的语句块

 

虚拟机在当前工作目录中寻找对应Revision.dll文件。如果是用命令行java Revision这样运行,工作目录就在class的所在文件夹,如果是用IDE运行,则由IDE决定,比如eclipse是整个项目的根目录。

 

然后javac编译这个类

如:javac Revision.java

 

在产生.class的文件夹里,用javah命令创建这个Java类对应的.h头文件

如: javah Revision

之后会在同文件夹里产生Revision.h

 

Java类Revision的信息已经包含在这个函数的标识符中了,同时__declspec(export)等win32的dll编译宏业已经在声明中前面包含了,所以不用多管。新建一个同名的c/cpp文件,include这个头文件,然后include需要的C/C++标准库文件,对头文件中的方法进行定义实现。在源文件里,定义函数的时候可以把这两个参数JNIEnv *, jobject 确定一个变量名比如JNIEnv * env,就可以调用JNI提供的虚拟机实现的API,可以把C/C++的数据逐步转化为Java数据,

 

比如这里的NewStringUTF就是产生Java字符串对应的C++字符串的方法,然后虚拟机会把jstring在运行时自动对应到Java的String类。具体的更多API实现,可以参考JNI的文档。

 

然后用gcc/g++来编译这个源文件。

> g++ -Wl,--kill-at -shared -o Revision.dll Revision.cpp

编译成功后,把dll放到工作目录里,正常运行调用了Java的Revision类的getHook方法的代码就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值