Java调用c代码

本文详细介绍了如何在IntelliJIDEA和IntelliJCLion中使用Java进行JNI编程,包括Java代码的准备、头文件生成、C代码的编译和dll的创建,以及处理Windows系统下的dll依赖问题。
摘要由CSDN通过智能技术生成

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

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值