一、JNI(Java Native Interface)的作用就是Java通过JNI调用其他语言的函数(或方法)(主要是C&C++)。

二、准备

1. java8系列jdk,有很多版本,任选一个即可,如jdk1.8.0.231。安装好,配置好环境。

2. vs2022或其它ide,写cpp的。

3. eclipse,写java源程序的。其它如idea,notebook,能写就行。需要配置好java环境。

三、写java源程序

1.  创建一个java项目,创建项目时选中环境jre1.8.0.231,eclipse自带的jre问题多多。

2. 右键选中项目JavaCallC,新建一个类,建类时给包取个名字。输入以下代码:

package javaCom;
public class JavaCallC { //如果用了public,类名和源文件名必须一致
    static { //加载动态库,不用加扩展名,windows下会加载testJni.dll,linux下会加载testJni.so
        System.loadLibrary("CtoJava"); //这就是dll名字,要和vs创建的项目名一致。
    }    
    public static native void sayHello();  //native声明一个本地接口,函数名任取,不用和包名,类名相同。
    public static void main(String[] args) { //类入口函数
        sayHello(); //调用sayHello函数
    }
}

3.  选中刚建好的java源文件JavaCallC.java,右键-显示位置-终端直接进入源文件目录(这样进去容易乱码,乱码时输入chcp 65001后回车纠正,不太好用。)。(也可以从资源管理器-我的电脑进入源文件目录,这样要要输入cmd.exe回车打开windows控制台。)

输入命令: javac -encoding UTF-8 -h ./comm JavaCallC.java

-encoding UTF-8        如果源文件里有中文注释,需要用这个转编码。

-h ./comm        表示在本级建个目录comm,把创建的头文件放入这个目录

如果使用不用这两个参数,则需要先用javac JavaCallC.java,然后回到src目录再用javah -d ./comm javaCom.JavaCallC两个命令。(两个命令经常不行,老会说找不到类,上面一行命令最好。)

此时会得到一个包名_类名.h的头文件javaCom_JavaCallC.h。目录结构为:

javaCom_JavaCallC.h的内容是这样的:

4.  打开vs2022,创建c++ win32空项目CtoJava(此名要和源文件中准备加载的dll文件名一致)。

在vs中右键点击项目名—添加—现有项,将javaCom_JavaCallC.h添加到工程中。此时工程的头文件目录里有一个头文件javaCom_JavaCallC.h。

5.  在vs中右键点击项目名—添加—新建项。创建一个ctojavatest.cpp文件,命名随意。代码如下: #include"javaCom_JavaCallC.h" //刚刚添加的那个头文件。
#include <stdio.h>
#include <iostream> //和下面的命名空间配合,才能使用cout
using namespace std; //和上面的iostream头文件配合,才能使用cout
JNIEXPORT void JNICALL Java_javaCom_JavaCallC_sayHello //这里把javaCom改为你的java包名,JavaCallC改为你的java类名,sayHello改为你的java函数名。
(JNIEnv*, jclass) {
    int a = 8, b = 10;
    printf("这是Java调用c/c++函数的例子!\n"); //这里用c/c++语法和函数要完成的功能。
    cout << "a + b = " << a + b << endl;
}

6. 创建cpp文件后,项目属性里才会新出现c/c++的设置项目,没创建前只有vc++设置项目。
(1) 右键点项目名-属性-配置属性-常规-配置类型修-改为动态库(.dll)
(2) 配置属性-高级-字符集-把unicode改为多字节集(为了中国区专用)
(3) 向c/c++(不是vc++,因为没用到它)的“附加包含目录”添加三个目录:

你第一步设置的java的jdk1.8.0.231\include,里面有个jni.h头文件要用

你第一步设置的java的jdk1.8.0.231\include\win32,里面有个jni_md.h头文件要用

你的java的javaCom_JavaCallC.h所在目录XXX\JavaCallC\src\javaCom\comm。

***此步必须做***这样vs2022才能找到jni.h和jni_md.h文件,否则ctojavatest.cpp会始终提示无法打开源文件,没有定义类型等错误。
(4) 设置c/c++-命令行-其它选项-添入utf-8.这个要和java编译JavaCallC.java源代码时的编码一致。
(5) 主菜单-文件-高级保存选项为unicode(utf-8带签名) (为了保险,不做有没有影响不想试了)。

7. 右键点击项目名—生成,vs项目的debug或release目录里会得到名为CtoJava.dll的动态库。到vs2022的CtoJava项目的debug或release目录里将CtoJava.dll复制到java\JavaCallC目录里,CtoJava.dll文件和src目录平级的。

8. 运行java项目,程序输出:


注意:整个过程中,java的运行环境jre和系统库最好选完全相同的版本。切记切记。

JNI步骤虽然多,按步骤一步一步来,还是可以成功的,中间看好多说JNI的都是要么少这个步骤,要么就少那个步骤,让我走了一些弯路,现在把详细步骤记录一下,看能否帮到各位初学者。

如果要传递参数,可以参看数据类型转换。

参考:

1. (6条消息) JNI详解------完整Demo_JAVA道人的博客-CSDN博客_jni

2. Jni快速入门 - 曹操是个好同志 - 博客园 (cnblogs.com)

Java调用c/c++(JNI)最详细步骤相关推荐

  1. java安装以及配置环境变量详细步骤

    java安装以及配置环境变量详细步骤 一.安装JDK(Java Development Kit开发工具包) 下载地址: http://www.oracle.com/technetwork/java/j ...

  2. Java调用高德地图API根据详细地址获取经纬度

    Java调用高德地图API根据详细地址获取经纬度 官方API:https://lbs.amap.com/api/webservice/guide/api/georegeo * Web服务API 地理/ ...

  3. 调用OpenSSL实现RC4算法(详细步骤)

    调用OpenSSL实现RC4 OpenSSL实现RC4算法 实验环境简介 实验源码 实验详细步骤 OpenSSL实现RC4算法 实验环境简介 Win10操作系统: Visual studio 2022 ...

  4. Linux平台Java调用so库-JNI使用例子

    1.确保gcc编译器已安装 2.编写HelloJNI.java代码,用native声明需要用C实现的函数. 如果源程序是包含在package里的话,应该建立同样的文件夹结构,比如/home/swan/ ...

  5. android jni java调用c_Android与JNI(一) ---- Java调用C 静态调用

    第一.通过eclipse新建一个工程名为HelloJni的android工程,并编译. 第二.右键工程-->Android Tools --> Add Native Support,出现如 ...

  6. linux java调用so文件路径_Linux平台Java调用so库-JNI使用例子

    1.确保gcc编译器已安装 2.编写HelloJNI.java代码,用native声明需要用C实现的函数. 如果源程序是包含在package里的话,应该建立同样的文件夹结构,比如/home/swan/ ...

  7. java实现支付宝扫码支付详细步骤

    支付宝扫码支付API文档地址:https://opendocs.alipay.com/open/194/106078         , 先配置好public_lkey和private_key 在支付 ...

  8. html css js调用dll,node调用dll 方法,及详细步骤

    Node – Dll Node调用DLL 1.DLL介绍 DLL(Dynamic Link Library)文件为动态链接库文件,又称"应用程序拓展",是软件文件类型.在Windo ...

  9. 如何在eclipse中导入Java项目文件包(方法截图详细步骤)

    如何在eclipse中导入Java项目文件包 首先新创建一个Java项目 第二步导入到我们新创建的Java项目文件包中 首先新创建一个Java项目 首先点击file->再点击new->点击 ...

最新文章

  1. GANs中的明星StarGAN:使用单一模型执行多个域的图像转换,GAN之父点赞
  2. SYSENTER——快速系统调用
  3. 关于Tomcat安装过程中出现的一些问题...
  4. Industry AI Live | 行为动作定位的算法流程介绍与分享
  5. 办大额信用卡致胜一招
  6. 通用窗口类 Inventory Pro 2.1.2 Demo1(中)
  7. NodeJs——子进程
  8. 小白都能理解的矩阵与向量求导链式法则
  9. 客服机器人代码_什么是第三方客服系统
  10. 知识点收录01---关于Tomcat的一些知识点
  11. 你想要的宏基因组-微生物组知识全在这(2020.03)
  12. 波士顿大学计算机工程硕士,波士顿大学计算机工程专业硕士.pdf
  13. 使用ivx滑动时间轴制作动画效果的经验总结
  14. 从金山毒霸看这个社会的“底线”
  15. 惠普笔记本固态装系统。
  16. 中国公交广告高峰论坛——天津
  17. 前端大屏页面布局经验
  18. 计算机基本原理 学习笔记(八)
  19. 黑苹果EFI合集,拥有1000多种机型,总有一款适合你,不断更新中!
  20. Windos下安装nexus私服(nexus-2.12.0-01)

热门文章

  1. studio3T import a SQL Database to Mongodb(从mysql中导入数据到mongodb)
  2. [笔记][总结] MIT线性代数 Gilbert Strang 正交矩阵
  3. JAVA技术栈学习路线整理【java后端开发应聘向】
  4. 数据分析实例-餐饮行业分析
  5. Java思考题——给定一个年份,让你判断出来该年对应天干地支纪年法的名称及生肖(三种方法实现)
  6. 中国征信行业市场发展模式及未来趋势展望报告2022-2028年
  7. 导出的excel表格是乱码的解决方法
  8. Mysql某个字段内容替换(字符串中的一部分内容替换) sql
  9. 电路-第五版-邱关源-习题解答-第一章
  10. %公式在计算机中怎么使用,在Excel 2013公式中使用函数并移动和复制——想象力电脑应用...