JNIは浅いから深いへ_5_基本タイプの適用

4517 ワード

1、基本タイプ応用
JNI処理の基本タイプは簡単ですが、Javaコードは次のとおりです.
<span style="font-size:14px;"> public native int intMethod(int n);



 public native boolean booleanMethod(boolean bool);</span>

上記の方法はJavaで書かれていますが、nativeキーワードを追加することに注意してください.この2つの方法は比較的簡単で、int、booleanタイプをjniにそれぞれ転送し、処理を経て戻ります.次はjniのコードです.
<span style="font-size:14px;">JNIEXPORT jint JNICALL Java_com_example_jniandroid_service_SimpleObject_intMethod(

		JNIEnv * env, jobject obj, jint val) {

	return val * val;

}



JNIEXPORT jboolean JNICALL Java_com_example_jniandroid_service_SimpleObject_booleanMethod(

		JNIEnv * env, jobject obj, jboolean val) {

	return !val;

}</span>

2、基本データ型の配列応用
2.1 c Javaのint[]を処理し、配列要素の合計を返します.
public native int intArrayMethod(int[] intArray);
/**

 *      ,    int  

 */

JNIEXPORT jint JNICALL Java_com_example_jniandroid_service_SimpleObject_intArrayMethod(

		JNIEnv * env, jobject obj, jintArray array) {

	int i, sum = 0;

	//       

	jsize len = (*env)->GetArrayLength(env, array);

	//          

	jint *body = (*env)->GetIntArrayElements(env, array, 0);

	for (i = 0; i < len; i++) {

		//        

		sum += body[i];

	}

	//    

	(*env)->ReleaseIntArrayElements(env, array, body, 0);

	LOGD("     =%d", sum);

	return sum;

}


2.2 nativeメソッドはint[]を返す.
public native int[] receiverIntArray();

対応するc署名
/**

 *   Java int[]  

 */

JNIEXPORT jintArray JNICALL Java_com_example_jniandroid_service_SimpleObject_receiverIntArray(

		JNIEnv * env, jobject obj) {

	int i = 1;

	jintArray array; //      

	array = (*env)->NewIntArray(env, 10);

	for (; i <= 10; i++) {

		//void SetIntArrayRegion(jintArray array, jsize start, jsize len,const jint *buf)//  len: 1

		(*env)->SetIntArrayRegion(env, array, i - 1, 1, &i);

	}

	/*             */

	int len = (*env)->GetArrayLength(env, array);

	/*            */

	jint* elems = (*env)->GetIntArrayElements(env, array, 0);



	for (i = 0; i < len; i++) {

		LOGD("ELEMENT %d IS %d
", i, elems[i]); } return array; }

3、JNIはstringタイプとString配列を処理する
	public native String stringMethod(String text);



	public native String[] receiverStringArray(String val);

以下はjniの実装であり、cファイルの前に配列長を宣言するdefine ARRAY_LENGTH 5 .1つ目の方法は、1つの文字列の各文字を大文字に変換し、2つ目の方法はStringタイプの配列を返します.ここでは、主にクラスのパッケージ名に基づいてクラスのclassを見つけ、newメソッドでオブジェクトを作成するFindClassメソッドを使用します.
JNIEXPORT jstring JNICALL Java_com_example_jniandroid_service_SimpleObject_stringMethod(

		JNIEnv * env, jobject obj, jstring string) {

	const char *str = (*env)->GetStringUTFChars(env, string, 0);

	char cap[128];

	//copy   

	strcpy(cap, str);

	(*env)->ReleaseStringUTFChars(env, string, str);

	int i = 0;

	for (i = 0; i < strlen(cap); i++) {

		//     

		*(cap + i) = (char) toupper(*(cap + i));

	}

	return (*env)->NewStringUTF(env, cap);



}



/**

 *   Java     

 */

JNIEXPORT jobjectArray JNICALL Java_com_example_jniandroid_service_SimpleObject_receiverStringArray(

		JNIEnv * env, jobject obj, jstring val) {

	//FindClass  Java String   ,  jni jclass  

	jclass objClass = (*env)->FindClass(env, "java/lang/String");

	//NewObjectArray      ,       ,     

	jobjectArray texts = (*env)->NewObjectArray(env, (jsize) ARRAY_LENGTH,objClass, 0);

	jstring jstr;

	char* sa[] = { "Hello,", "world", "jni", "iii", "    " };

	int i = 0;

	for (; i < ARRAY_LENGTH; i++) {

		//  jstring   ,NewStringUTF()   C         jstring  

		jstr = (*env)->NewStringUTF(env, sa[i]);

		//  

		(*env)->SetObjectArrayElement(env, texts, i, jstr); //    jstring

	}

	return texts;



}