2016-11-07 9 views
0

私はJNIでの経験はありませんが、私は与えられたコードの一部を変更する必要があります。私のC++コードでJNI経由で2D配列の代わりに通常の1D配列を取得するには?

、私は、この方法は、(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++コードで使用できる2次元配列を与えます。

しかし、私は(float ** prestack2Dがfloat * prestack1Dになるような)で渡す通常の1D float配列[]にするために、このコードを変更する必要があります。

通常のフロート配列を取得するために正確に何を変更しますか?私は幸運とGetObjectFieldとGetFloatArrayElementsを試してみました。私はこれが本当に簡単な質問ですが、私はJNIに関する経験がなく、今は疲れていると言いましたが、JNIの文書は私が慣れていたものほど良くはないと思います。

+1

2Dから1Dへのマッピング(行* number_columns +列)を使用して1Dフルタイムで滞在しましたか? – user4581301

+0

[JNIを使​​用してfloat \ *をjfloatArrayに変換]の可能な複製(http://stackoverflow.com/questions/25011597/convert-float-to-jfloatarray-using-jni) –

答えて

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が不足するからです。