打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
JNA 实现Java调用C动态链接库

1、开发环境:

Java环境:JDK 1.6.0_18

2、C++代码

创建一个动态链接库项目JNALib,创建一个c++源文件clib.cpp,生成结果为libJNALib.dll
  1. #include <stdlib.h>
  2. #include <iostream>
  3. using namespace std;
  4. extern "C"
  5. {
  6.     typedef void (*OpenFunc)(const char*,int);

  7.     OpenFunc openfunc = NULL;

  8.     void init(OpenFunc func) {
  9.         cout << "init called" <<endl;
  10.         openfunc = func;
  11.     }

  12.     void test() {
  13.         if (openfunc == NULL) {
  14.             cout << "openfunc is NULL" << endl;
  15.         }
  16.         (*openfunc)("test", 0);
  17.     }
  18. }
复制代码
注意:其中OpenFunc声明了一个回调类型,也就是一个函数指针,可以通过init将java中的OpenFunc方法传递进来,设置这个函数指针,如此一来,可以实现C++到Java的回调。

3、Java代码

创建一个Java项目JNADemo,创建一个包clibtest,创建以下java代码:
  1. package clibtest;

  2. import com.sun.jna.Callback;
  3. import com.sun.jna.Library;


  4. public interface CLib extends Library{

  5.     public interface OpenFunc extends Callback {
  6.         void invoke(String filename, int i);
  7.     }
  8.     void init(OpenFunc openfunc);
  9.     void test();
  10. }

  11. package clibtest;

  12. import com.sun.jna.Native;

  13. public class hello {

  14.     public static void main(String[] args) {
  15.         // Loading dynamically the library
  16.         CLib lib = (CLib) Native.loadLibrary("libJNALib", CLib.class);

  17.         lib.init(new CLib.OpenFunc() {

  18.             public void invoke(String filename, int i) {
  19.                 System.out.println("callback called.");
  20.                 System.out.println(filename);
  21.             }
  22.         });

  23.         lib.test();
  24.     }
  25. }
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
【转】如何在android上支持JNA <一>知识准备
Java静态变量的初始化(static块的本质
JSP学习 —— 开篇:JSP,servlet容器,Tomcat,servlet容器之间的关系
Android_Sensor
[深入理解Android卷一 全文
java 初始化总结
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服