1.开发工具
IntelliJ IDEA :java开发
IntelliJ Clion:c开发
2.Java步骤
1.准备代码
public class InvokeC {
public native void bubbleSort(int[] arr);
}

2.配置头文件生成工具
#javah
C:\Program Files\Java\jdk1.8.0_172\bin\javah.exe
#javah参数在$OutputPath$下找到$FileClass$ 并生成头文件到($ProjectFileDir$)./jni目录下
-classpath $OutputPath$ -d ./jni $FileClass$
#项目根目录
$ProjectFileDir$

3.编译代码生成class文件

4.使用工具生成头文件

5.在jni目录下有头文件生成

3.c步骤
1.创建dll项目


2.复制以下文件列表到 C项目下
"C:\Program Files\Java\jdk1.8.0_172\include\win32\jni_md.h"
"C:\Program Files\Java\jdk1.8.0_172\include\jni.h"
".jni\com_yll_InvokeC.h" #java生成的头文件,需要C来实现

调整代码,可能会报错。


以下代码可能会报错,jni不一样。可以根据错误自己改一下

#include "com_yll_InvokeC.h"
void bubbleSort(jint *elements, jint sz);
void bubbleSort(jint *elements, jint sz) {
for (int i = 0; i < sz - 1; ++i) {
for (int j = 0; j < sz - i - 1; ++j) {
if (elements[j] > elements[j + 1]) {
int temp;
temp = elements[j];
elements[j] = elements[j + 1];
elements[j + 1] = temp;
}
}
}
}
JNIEXPORT void JNICALL Java_com_yll_InvokeC_bubbleSort
(JNIEnv *env, jobject, jintArray array) {
jint *elements = (*env).GetIntArrayElements(array, NULL);
jint sz = (*env).GetArrayLength(array);
bubbleSort(elements, sz);
//0释放elements指针,并更新array数据
(*env).ReleaseIntArrayElements(array, elements, 0);
}
/*
//如果报错可以用这段代码替换看看
JNIEXPORT void JNICALL Java_com_yll_InvokeC_bubbleSort
(JNIEnv *env, jobject, jintArray array){
jint *elements = (*env)->GetIntArrayElements(env, array, NULL);
jint sz = (*env)->GetArrayLength(env, array);
bubbleSort(elements, sz);
//0释放elements指针,并更新array数据
(*env)->ReleaseIntArrayElements(env, array, elements, 0);
}
*/
3.构建dll

4.复制dll到idea的lib目录下(没有就新建)。

4.加载dll并输出结果
1.加载和调用代码

public class Main {
static {
System.loadLibrary("lib/libbubbleSort");
}
public static void main(String[] args) {
InvokeC nativeCode = new InvokeC();
int[] elements = {1, 3, 2, 5, 6, 7, 9, 8, 4};
nativeCode.bubbleSort(elements);
Arrays.stream(elements).forEach(System.out::print);
}
}
2.执行结果

5.注意事项
生成头文件其他方式:
1.javac -h . InvokeC.java # 编译.java为.class 再-h 生成头文件
2.Javah InvokeC #把class文件生成头文件。这种方式必须先编译代码生成class。否则报错
网上很多资料,都是printf(“helllo!”);的demo。但是我换成count<<就报错。
莫名其妙依赖找不到,明明就在,为什么呢?
cout<< #java调用会报错dll找不到
使用Dependencies_x64_Release: dll依赖分析工具
Dependencies_x64_Release

将我们的dll拖进去可以看到,缺少依赖:

解决方法:把这三个文件复制到C:\Windows\System32目录下

再来一次,可以看到以来有了。:

再来执行就可以了。
6.参考来源
1.使用 IntelliJ IDEA 和 IntelliJ Clion 进行 JNI 开发-CSDN博客
2.Idea开发Jni程序(Windows+Android)_idea安卓项目添加jni-CSDN博客
3.使用IntelliJ IDEA和CLion开发JNI环境搭建_clion jni-CSDN博客
4.JNI 传递和返回基本参数_jin传参-CSDN博客
5.Java Native Interface(JNI)从零开始详细教程-CSDN博客
6.Windows下查看程序依赖开源工具Dependencies使用
本文详细介绍了如何在IntelliJIDEA和IntelliJCLion中使用Java进行JNI编程,包括Java代码的准备、头文件生成、C代码的编译和dll的创建,以及处理Windows系统下的dll依赖问题。

1528

被折叠的 条评论
为什么被折叠?



