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使用