研究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代码最尽量多的事吧