JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。

JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法。

简单介绍及应用如下:

一、JAVA中所需要做的工作

在JAVA程序中,首先需要在类中声明所调用的库名称,如下:

在这里,库的扩展名字可以不用写出来,究竟是DLL还是SO,由系统自己判断。 还需要对将要调用的方法做本地声明,关键字为native。并且只需要声明,而不需要具体实现。如下:

然后编译该JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就会生成C/C++的头文件。

例如程序testdll.java,内容为:

用javac testdll.java编译它,会生成testdll.class。

再用javah testdll,则会在当前目录下生成testdll.h文件,这个文件需要被C/C++程序调用来生成所需的库文件。

二、C/C++中所需要做的工作

对于已生成的.h头文件,C/C++所需要做的,就是把它的各个方法具体的实现。然后编译连接成库文件即可。再把库文件拷贝到JAVA程序的路径下面,就可以用JAVA调用C/C++所实现的功能了。

接上例子。我们先看一下testdll.h文件的内容:

在具体实现的时候,我们只关心两个函数原型

这里JNIEXPORT和JNICALL都是JNI的关键字,表示此函数是要被JNI调用的。而jint是以JNI为中介使JAVA的int类型与本地的int沟通的一种类型,我们可以视而不见,就当做int使用。函数的名称是JAVA_再加上java程序的package路径再加函数名组成的。参数中,我们也只需要关心在JAVA程序中存在的参数,至于JNIEnv*和jclass我们一般没有必要去碰它。

好,下面我们用testdll.cpp文件具体实现这两个函数:

编译连接成库文件,本例是在WINDOWS下做的,生成的是DLL文件。并且名称要与JAVA中需要调用的一致,这里就是goodluck.dll

把goodluck.dll拷贝到testdll.class的目录下,java testdll运行它,就可以观察到结果了。

原文:

java如何用c 的方法_JAVA如何调用C/C++方法相关推荐

  1. java 调用父级方法_java子类调用父类的方法是什么

    java子类调用父类的方法:1.子类的对象调用方法时,会首先在子类中查找,如果子类中没有该方法,再到父类中查找:2.如果该方法中又调用了其他方法,那么还是按照之前的顺序,先在子类中查找,再在父类中查找 ...

  2. java 反射无参方法_java 反射 调用无参数方法?

    通过Java反射调用无参数方法,这是个测试用的例子,通过反射调用对象的方法,代码如下: import java.lang.reflect.Method; import java.lang.reflec ...

  3. java 调用父级方法_java子类调用父类的方法中包含子类重写的实例方法

    # 看题目是不是很绕,这个我也不知道怎么才能更简单的表达了 # 先看代码: public class Common { public static void main(String[] args) { ...

  4. 【Kotlin】Kotlin 类的继承 三 ( super 关键字使用 | super@ 外部调用父类方法 | 子类选择性调用 父类 / 接口 方法 super )

    文章目录 I . 子类调用父类总结 II . 子类调用父类方法 ( super ) III . 子类内部类调用父类方法 ( super@ ) IV . 子类选择调用不同的 父类 / 接口方法 ( su ...

  5. java clone方法_java安全编码指南之:方法编写指南

    简介 java程序的逻辑是由一个个的方法组成的,而在编写方法的过程中,我们也需要遵守一定的安全规则,比如方法的参数进行校验,不要在assert中添加业务逻辑,不要使用废弃或者过期的方法,做安全检查的方 ...

  6. java 创建文件夹的方法_Java创建文件夹的方法

    Java创建文件夹的方法 /** * 用于创建文件夹的方法 * @param mkdirName */ public void mkdir(String mkdirName) { try { File ...

  7. java如何循环调用方法_Java:调用方法的“中断”循环?

    我的小程序有点问题. 我有一个JOptionPane要求一个数字,如果该数字小于10,则一个循环会一直持续下去,并永远做下去,继续询问数字. 在该循环内,我调用一个方法,将int作为参数. 在该方法中 ...

  8. java 子类的同名方法_java 父类子类有同名方法时如何调用的实现

    父类引用默认调用子类重写的方法 如果父类的引用p指向了子类的实例,则通过这个引用p访问同名方法时,调用的是子类重写的方法. 父类引用p可以指向不同的子类,调用不同子类重写的不同的同名方法,进而达到类间 ...

  9. java 反射调用set方法_java反射调用set方法时如果让参数做自动类型转换

    这段时间学习java的反射机制想实现一个功能:遍历一个Map,然后利用反射机制调用BO的set方法,完成BO属性的自动注入.这样设计的初衷是解决Excel数据导入问题中的Map数据填充BO这一过程. ...

最新文章

  1. 蜻蜓resin服务器虚拟目录的设置
  2. Android 中查看内存的使用情况集经常使用adb命令
  3. 谷歌zxing 二维码生成工具
  4. 在线教育流量洪峰最佳实践
  5. 转:绝对干货--WordPress自定义查询wp_query所有参数详细注释
  6. win7 php环境搭建 x64,win7搭建php+Apache环境
  7. 已知前序中序求层序 c语言递归,二叉树的遍历:前序,中序,后序,层序--包括递归和非递归实现...
  8. Galaxy Nexus(i9250)卡在开机画面(‘X’画面)解决方法
  9. Request介绍及演示样例 PART1
  10. 中国 AI 开发者真实现状:人才依赖海外引进,本科 AI 教育盛行
  11. iOS 使用脚本自动化复制target
  12. 最好用电脑录音软件推荐
  13. 【Blog】解决CSDN博客修改头像后依旧显示默认头像问题的方法
  14. 微信公众号支付——预支付订单
  15. Ubuntu 10.10 无线网络已经禁用” “wiress is disabled” 解决方法
  16. Windows桌面应用程序(1-2-4-2nd) 桌面窗口管理器
  17. docker实战学习2022版本(七)之docker网络学习
  18. 当面试问到自己有哪些缺点应该怎么回答
  19. Qt优秀开源项目之十:开源截图工具flameshot
  20. python设置坐标轴刻度宽度_使用轴网格matplotlib时设置刻度宽度

热门文章

  1. 核磁共振影像数据处理-3-DTI基础、Li‘s have a solution and plan.
  2. 第三代测序技术的主要特点及其在病毒基因组研究中的应用
  3. 论文解读 Combating Adversarial Misspellings with Robust Word Recognition
  4. 设备树下字符设备驱动
  5. linux环境变量管理器,运维 - linux(ubuntu) 环境变量管理 (持续更新)
  6. jupyter notebook 插入图片
  7. python 修改列表中的元素
  8. 微信截取菜单栏(不收回)
  9. 网页转变成app,隐藏浏览器地址栏
  10. latex下IEEE模板中嵌套Python代码