知识屋:更实用的电脑技术知识网站
所在位置:首页 > 教育

如何在Java项目中定义并调用自己编写的native方法?

发表时间:2022-03-26来源:网络

如何在Java项目中定义并调用C/C++编写的native方法?

开发工具编写测试的java代码编写C++代码将dll文件链接到java项目中*总结*

开发工具

IntelliJ IDEA 2020 (用来编写java代码
Visual Studio 2019 (用来编写用C++实现的native方法

编写测试的java代码

(1)编写代码: 在src目录下新建一个包Package0,在该包中建一个类HelloCPlus。

package Package0; public class HelloCPlus { //这是在之前代码的基础之上添加的代码,目的是添加.dll文件 static { System.loadLibrary("Dllforjavatest1"); } public native int HelloJava(); //信息 public native int CPlusMax(int... elements); //求最大值 public native int CPlusMin(int... elements); //求最小值 public native int CPlusAccumulate(int... elements); //求累加和 public static void main(String[] args) { HelloCPlus helloCPlus = new HelloCPlus(); System.out.println("-------"); helloCPlus.HelloJava(); int[] apples = {4,5,6,7,1,2,3}; System.out.println("数组最小值为:"+helloCPlus.CPlusMin(apples)); System.out.println("数组最大值为:"+helloCPlus.CPlusMax(apples)); System.out.println("数组的累加和为:"+helloCPlus.CPlusAccumulate(apples)); } }

(2)使用命令生成项目头文件,即.h文件。

这里可以有两个步骤:
第一个步骤:

使用“WIN+R”命令输入CMD打开Windows的命令行程序,进入到项目的类目录中,使用命令 javah -classpath E:\Java_learning_project\JNIProgramTest\src -jni Package0.HelloCPlus
即可生成HelloCPlus的.h文件(注:生成的.h文件将会存放在项目的类目录中)



第二个步骤:

先运行main方法,报错没关系,在IDEA中切换到terminal命令窗口,使用命令:javah -classpath out\production\JNIProgramTest -d ./jni Package0.HelloCPlus,就可以将生成的.h文件置于jni目录中

编写C++代码

使用 Visual Studio 2019 编写C++实现的native方法。
(1)新建项目:



(2)配置头文件:
找到本地电脑JDK1.8安装路径。将路径下的jni.h和jni_md.h文件复制到C++项目路径下:


然后将IDEA创建的头文件Package0_HelloCPlus.h复制到项目路径下:

最后再将这三个文件添加到Visual Studio创建的项目的头文件中。

(3)实现C++代码:
首先修改一下Package0_HelloCPlus.h的开头部分:
新建C++源文件HelloJava.cpp:


HelloJava.cpp代码实现如下:

#include "Package0_HelloCPlus.h" #include "jni.h" //导入两个头文件 #include #include #include //std::accumulate using namespace std; //Native调用的方法 /* JNI方法基本格式:JNIEXPORT 返回值类型 JNICALL 方法名(参数列表) * 方法名规范:Java_包名_类名_方法名 * 参数列表:JNIEnv *env 第一个参数是JNI环境参数,即JNIEnv类型的指针。 * jobject instance 第二个参数是native方法的Java类对象。 */ JNIEXPORT jint JNICALL Java_Package0_HelloCPlus_HelloJava (JNIEnv* env, jobject obj) { cout //获取arrays对象的指针 jint* int_arr = env->GetIntArrayElements(jarr, NULL); //获取数组的长度 jsize len = env->GetArrayLength(jarr); return *min_element(int_arr, int_arr + len); } JNIEXPORT jint JNICALL Java_Package0_HelloCPlus_CPlusAccumulate (JNIEnv* env, jobject obj, jintArray jarr) { //获取arrays对象的指针 jint* int_arr = env->GetIntArrayElements(jarr, NULL); //获取数组的长度 jsize len = env->GetArrayLength(jarr); return accumulate(int_arr, int_arr + len, 0); //初始值为0 }

(4)配置管理器,生成.dll动态链接库文件。

使用快捷键或者点击"生成"——>“生成Dll_for_java_test1”,编译项目。

将dll文件链接到java项目中

有两种方法。第一种:
直接将把生成的.dll文件放入idea的项目根目录下,执行方法。


第二种:

在VM options中添加.dll文件的路径:-Djava.library.path="D:\Program Files (x86)\VS_2019\C++projects\Dll_for_java_test1\x64\Debug"


调试成功。

总结

编写java代码,生成头文件 ——> 引入头文件,编写C++实现代码,生成dll文件 ——> 将dll文件链接到java项目中。

希望这篇文章对你有帮助

收藏
  • 人气文章
  • 最新文章
  • 下载排行榜
  • 热门排行榜