JNI学习笔记——int数组赋值要注意的问题

本文详细记录了一位开发者在学习JNI的过程中,从创建int数据并返回到最终成功实现的方法改进过程。主要关注了C++与Java之间的类型转换问题,包括指针的理解和正确使用,以及避免不必要的JAVA代码介入C++逻辑区域的重要性。通过实例分析,揭示了在JNI开发中常见错误及解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

研究JNI有2天了,从最初的环境搭建成功的喜悦,到后来的代码频频报错的苦恼,

不由感慨必须记录一个学习日志来保证下次有资料可查!毕竟只有自己猜知道自己想要什么。

进入正题:

经过了最初的“Hello JNI”,开始向更深处探索,于是很不明智的第一个方法选择了创建int数据并返回。

经过了一些自以为是的coding,发现JNI并非我想象的那样,于是就出了好多乌龙,各种编译器报错都有。

最揪心的莫过于以下代码的出错

for (int i = 0; i < size; ++ i) {
	jint *h = (jint)i;
	env->SetIntArrayRegion(result,i,1,h);
}

这段代码充分显示了我C++的破烂程度,虽然编译器不报错,但是很悲剧的运行的时候死机了强退了。

我觉得应该是类似OOM的错误,虽然Log没有打印出来。

遍查百度Google,发现没有我这种例子可找,大都是二维数组,对象数组。

一直到今天,我才突然发现为什么我要单个赋值呢,C++和JAVA的转换可以再最初和最后进行,中间完全

可以是C++的逻辑代码,只要最后使用虚拟机对象做类型转换即可。

于是代码修改如下

jintArray result;
result = env->NewIntArray(size);
jint *h = new jint[size];
for (int i = 0; i < size; ++ i) {
	h[i] = (jint)i;
}
env->SetIntArrayRegion(result,0,size,h);

终于成功了,在此记录两点:

1. *为指针对象,需补习一下知识。

2.不要让JAVA代码/逻辑做C++代码要做的事,转换放在必要的时候做,既然使用了JNI,就让C代码最尽量多的事吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值