我正在编写一个进行大量计算的引擎。 引擎用c / c ++编写,并返回一个3-d双数组到本机。 当我尝试运行应用程序时,本机通过执行所有计算的jni到c代码进行调用,并且在返回语句中应用程序崩溃。 相同的代码是
原型声明是:
JNIEXPORT jobjectArray JNICALL Java_com_example_testbi_MainActivity_EngineCalculations
(JNIEnv *env,jobject this)
之后进行主要计算,然后返回逻辑为:
doubleArrayClass = (*env)->FindClass(env,"[[D");
__android_log_print(ANDROID_LOG_INFO, "Engine","\n!* doubleArrayClass declared...");
innerdoubleArrayClass = (*env)->FindClass(env,"[D");
__android_log_print(ANDROID_LOG_INFO, "Engine","\n!* innerdoubleArrayClass declared...");
returnArray = (*env)->NewObjectArray(env,5,doubleArrayClass,NULL);
__android_log_print(ANDROID_LOG_INFO, "Engine","\n!* returnArray declared...");
for(i = 0;i < 3;i ++)
{
__android_log_print(ANDROID_LOG_INFO, "Engine","\n!* inside for loop of i...%d",i);
outerArray = (*env)->NewObjectArray(env,ProductDetails.iPolicyTerm+1,innerdoubleArrayClass,NULL);
for(j = 0;j <= ProductDetails.iPolicyTerm;j ++)
{
__android_log_print(ANDROID_LOG_INFO, "Engine","\n!* inside for loop of j...%d",j);
doubleArray = (*env) -> NewDoubleArray(env,15);
if(i == 0 || i == 1)
{
__android_log_print(ANDROID_LOG_INFO, "Engine","\n!* inside if loop of i :%d",i);
(*env) -> SetDoubleArrayRegion(env,doubleArray,0,15,(jdouble*)dReturnArray[i][j]);
}
if(i == 2)
{
__android_log_print(ANDROID_LOG_INFO, "Engine","\n!* inside if loop of i :%d",i);
(*env) -> SetDoubleArrayRegion(env,doubleArray,0,2,(jdouble*)dOtherCalculatedValues[j]);
}
(*env) -> SetObjectArrayElement(env,outerArray,(jsize)j,doubleArray);
(*env) -> DeleteLocalRef(env,doubleArray);
}
__android_log_print(ANDROID_LOG_INFO, "Engine","\n!* completed j loop ...");
(*env) -> SetObjectArrayElement(env,returnArray,(jsize)i,outerArray);
__android_log_print(ANDROID_LOG_INFO, "Engine","\n!* completed j loop .2nd time..");
(*env) -> DeleteLocalRef(env,outerArray);
__android_log_print(ANDROID_LOG_INFO, "Engine","\n!* completed DeleteLocalRef");
}
__android_log_print(ANDROID_LOG_INFO, "Engine","\n!* returning retuirn array....");
}
return returnArray;
我看到的日志是:
01-27 09:53:39.272:I / Engine(4594):!* if if i:2
01-27 09:53:39.272:I / Engine(4594):!*已完成j循环......
01-27 09:53:39.272:I / Engine(4594):!*完成了j循环.2nd时间..
01-27 09:53:39.272:I / Engine(4594):!*已完成DeleteLocalRef
01-27 09:53:39.272:I / Engine(4594):! *返回retuirn数组......
之后应用程序崩溃。