首页 > 基础资料 博客日记
Java调用c/c++(JNI)最详细步骤
2023-07-24 17:23:29基础资料围观455次
一、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的都是要么少这个步骤,要么就少那个步骤,让我走了一些弯路,现在把详细步骤记录一下,看能否帮到各位初学者。
如果要传递参数,可以参看数据类型转换。
参考:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签: