[Java][C/C++] JNIで配列を引数や返り値に使う

| コメント(0) | トラックバック(0)
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++での実装
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;
}


トラックバック(0)

トラックバックURL: http://blog.isocchi.com/MovableType/mt-tb.cgi/323

コメントする

このブログ記事について

このページは、isocchiが2009年1月13日 00:19に書いたブログ記事です。

ひとつ前のブログ記事は「[Java] MacでJNI 〜JavaからC++を呼ぶ〜」です。

次のブログ記事は「[Java] tomcat pluginの場所」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

Powered by Movable Type 5.0