JavaとC++で配列をやりとりするときのメモ
例えば、int配列を2つ引数にとり、それらを連結したint配列を返す関数appendを作る。
・Java
public native int[] append(int[] a, int[] b);
・ヘッダファイル
JNIEXPORT jintArray JNICALL Java_Hoge_append(JNIEnv *, jobject, jintArray, jintArray);
・C++での実装
例えば、int配列を2つ引数にとり、それらを連結したint配列を返す関数appendを作る。
・Java
public native int[] append(int[] a, int[] b);
・ヘッダファイル
JNIEXPORT jintArray JNICALL Java_Hoge_append(JNIEnv *, jobject, jintArray, jintArray);
・C++での実装
JNIEXPORT jintArray JNICALL Java_Hoge_append(JNIEnv *env, jobject obj, jintArray a, jintArray b) {
jboolean jbool;
int i, aLength, bLength;
jint* aArray, bArray, resultArray;
jintArray result;
// jintArrayから、C++で扱えるjint*に変換
aArray = env->GetIntArrayElements(a, &jbool);
bArray = env->GetIntArrayElements(b, &jbool);
// 配列の長さを取得
aLength = env->GetArrayLength(a);
bLength = env->GetArrayLength(b);
// Javaに返せるような配列を作成
result = env->NewIntArray(aLength+bLength);
// C++で扱えるように変換
resultArray = env->GetIntArrayElements(result, &jbool);
// 連結
for(i=0; i<aLength; i++) {
resultArray[i] = aArray[i];
}
for(; i<aLength+bLength; i++) {
resultArray[i] = bArray[i];
}
// リリースを解放。jintでの変更をjintArrayに反映
env->ReleaseIntArrayElements(a, aArray, 0);
env->ReleaseIntArrayElements(a, bArray, 0);
env->ReleaseIntArrayElements(result, resultArray, 0);
return result;
}

コメントする