如何通过JNI获得普通的1D阵列而不是2D阵列?

时间:2016-11-07 06:01:40

标签: java c++ arrays java-native-interface

所以我没有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的文档并不像我以前那样好。

1 个答案:

答案 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可能会变得饥饿。