概要jni(四)
2575 ワード
配列の処理
配列は2種類に分けられる:1.基本タイプの配列2.オブジェクト(Object[])の配列
配列長の取得
基本的なタイプのデータを処理するときも文字列を処理するのと似たような関数があります.
GetArrayElements(Array arr, jboolean* isCopied);このような関数はJava基本タイプの配列をc/c++の配列に変換することができる.ローカルコードを1部コピーし、Java配列を指すポインタをローカルコードに直接返信し、ローカライズされた配列を処理した後、ReleaseArrayElementsで配列を解放する2つの処理方式がある.
ReleaseArrayElements(Array arr,*array,jint mode)この関数でJavaとc++の配列をどのように処理するかを選択できます.コミットするか取り消すか、メモリが解放されるか、置くかなどです.
modeは次の値をとることができます.
0:Javaの配列を更新し、c/c++の配列を解放する
JNI_COMMIT:Javaの配列を更新するがc/c++の配列を解放しない
JNI_ABORT:Javaの配列を更新せず、c/c++の配列を解放する
オブジェクトタイプ配列の操作
例:
JAva側:
JNIは、Javaのオブジェクトタイプ配列を直接c++のjobject[]配列に移動する関数ではなく、直接
配列は2種類に分けられる:1.基本タイプの配列2.オブジェクト(Object[])の配列
配列長の取得
jsize GetArrayLength(jarray array) {
return functions->GetArrayLength(this,array);
}
基本データ型配列の処理基本的なタイプのデータを処理するときも文字列を処理するのと似たような関数があります.
Get
Release
modeは次の値をとることができます.
0:Javaの配列を更新し、c/c++の配列を解放する
JNI_COMMIT:Javaの配列を更新するがc/c++の配列を解放しない
JNI_ABORT:Javaの配列を更新せず、c/c++の配列を解放する
void * GetPrimitiveArrayCritical(jarray array, jboolean *isCopy) {
return functions->GetPrimitiveArrayCritical(this,array,isCopy);
}
void ReleasePrimitiveArrayCritical(jarray array, void *carray, jint mode) {
functions->ReleasePrimitiveArrayCritical(this,array,carray,mode);
}
もJDK 1である.2で出てくるのは,Java配列を指すポインタを直接返すための関数を増やすためであり,同様にGetStringCriticalとのデッドロック問題もある.オブジェクトタイプ配列の操作
例:
JAva側:
public class TestMain {
public int[] intarr={1,2,3,4};
public native void getjni();
public static void main(String[] args) {
// TODO Auto-generated method stub
System.loadLibrary("ConsoleApplication");
TestMain j = new TestMain();
j.getjni();
}
}
c/c++: JNIEXPORT void JNICALL Java_com_cn_TestMain_getjni
(JNIEnv * env, jobject obj){
jclass cls=env->GetObjectClass(obj);
jfieldID fid_arrays=env->GetFieldID(cls,"intarr","[I");
jintArray jint_arr=(jintArray)env->GetObjectField(obj,fid_arrays);
jint* int_arr=env->GetIntArrayElements(jint_arr,NULL);
jsize len=env->GetArrayLength(jint_arr);
for(jsize i=0;i<len;i++){
cout<<int_arr[i]<<endl;
}
env->ReleaseIntArrayElements(jint_arr,int_arr,JNI_ABORT);
};
JNIは、Javaのオブジェクトタイプ配列を直接c++のjobject[]配列に移動する関数ではなく、直接
jobject GetObjectArrayElement(jobjectArray array, jsize index) {
return functions->GetObjectArrayElement(this,array,index);
}
void SetObjectArrayElement(jobjectArray array, jsize index,
jobject val) {
functions->SetObjectArrayElement(this,array,index,val);
}
のような関数は、JavaのObject[]データを操作する.