所以我没有JNI的经验,但是我需要改变我给出的一小部分代码。
在我的c ++代码中,我定义了这个方法(java端代码调用):
JNIEXPORT void JNICALL sumTraces
(JNIEnv* env, jclass caller, jobjectArray jPrestackArrays, jint count) {
jPrestackArrays jobjectArray是java端传入的2D float数组[] []。上面的代码是:
float** prestack2D = (float**)malloc(nTracesIn * sizeof(float*));
for (int j = 0; j < count; j++) {
jfloatArray floatArrayJ = (jfloatArray)env->GetObjectArrayElement(jPrestackArrays, j);
prestack2D[j] = (float*)env->GetPrimitiveArrayCritical(floatArrayJ, &isCopy);
}
代码以:
结尾 for (int j = 0; j < count; j++) {
jfloatArray floatArrayJ = (jfloatArray)env->GetObjectArrayElement(jprestackTraces, j);
env->ReleasePrimitiveArrayCritical(floatArrayJ, prestack2D[j], JNI_ABORT);
}
所以这给了我一个可以在c ++代码中使用的2D数组。
但是我需要更改此代码,而不是让它成为普通的1D float array [],java传入(这样float ** prestack2D变为float * prestack1D)。
为了获得正常的浮点数组,我到底要改变什么?我没试过GetObjectField和GetFloatArrayElements。我认为这是一个非常容易回答的问题,但是就像我说我没有JNI的经验而我现在已经筋疲力尽了,JNI的文档并不像我以前那样好。
答案 0 :(得分:1)
所以,你的Java方法将是
static native void sumTraces(float[], int);
及其C ++方
JNIEXPORT void JNICALL sumTraces
(JNIEnv* env, jclass caller, jfloatArray jPrestackArray, jint count);
现在,您可以使用
float* prestack1D = (float*)env->GetPrimitiveArrayCritical(jPrestackArray, &isCopy);
别忘了发布:
env->ReleasePrimitiveArrayCritical(jPrestackArray, prestack1D, JNI_ABORT);
请注意,您应该尽快尝试使用 GetPrimitiveArrayCritical()锁定版本阵列。原始代码看起来很危险,因为如果它锁定了许多数组,并且进行了大量处理,那么Java VM可能会变得饥饿。