JNIEXPORT jobjectArray JNICALL Java_com_testASIFT_LibASIFT_qq(JNIEnv* env,jobject obj, jintArray iarr, int w, int h){
jint *cbuf;
cbuf = env->GetIntArrayElements(iarr, false);
ipixels1.clear();
PixelToVector(cbuf, w, h, &ipixels1);
env->ReleaseIntArrayElements(iarr, cbuf, 0);
keypointslist v;
siftPar siftparameters;
default_sift_parameters(siftparameters);
compute_sift(v, ipixels1,w, h, siftparameters);
//申明一个object数组
jobjectArray args = 0;
//数组大小
jsize len = 100;
//获取object所属类,一般为ava/lang/Object就可以了
jclass objClass = (env)->FindClass("java/lang/Object");
//获取类中每一个变量的定义
//名字
jfieldID str = (env)->GetFieldID(objClass,"name","java/lang/String;");
//序列号
jfieldID ival = (env)->GetFieldID(objClass,"serial","I");
//新建object数组
args = (env)->NewObjectArray(len, objClass, 0);
//给每一个实例的变量付值,并且将实例作为一个object,添加到objcet数组中
for(int i=0;i<VecLength;i++)
{
jobject _obj;
for (int j=0;j<128;j++)
{
(env)->SetShortField(_obj,ival,(int)(v[i].vec[j]));
(env)->SetObjectArrayElement(args, i*128+j, _obj);
};
};
//返回object数组
return args;
}
这段代码是要把v里面的数组通过jobjectArray的args传递到java层。v的结构是这样的:
typedef std::vector<keypoint> keypointslist;
struct keypoint {
float x,y,
scale,
angle;
float vec[VecLength];
};
编译通过了,但是每次运行logcat都显示vm aborting,是内存问题吗?
这段代码是网上复制改编的,不明白,哪里不对?
------解决方案--------------------
散分了!见者有份!