JNIは浅いから深いへ_5_基本タイプの適用
4517 ワード
1、基本タイプ応用
JNI処理の基本タイプは簡単ですが、Javaコードは次のとおりです.
上記の方法はJavaで書かれていますが、nativeキーワードを追加することに注意してください.この2つの方法は比較的簡単で、int、booleanタイプをjniにそれぞれ転送し、処理を経て戻ります.次はjniのコードです.
2、基本データ型の配列応用
2.1 c Javaのint[]を処理し、配列要素の合計を返します.
2.2 nativeメソッドはint[]を返す.
対応するc署名
3、JNIはstringタイプとString配列を処理する
以下はjniの実装であり、cファイルの前に配列長を宣言するdefine ARRAY_LENGTH 5 .1つ目の方法は、1つの文字列の各文字を大文字に変換し、2つ目の方法はStringタイプの配列を返します.ここでは、主にクラスのパッケージ名に基づいてクラスのclassを見つけ、newメソッドでオブジェクトを作成するFindClassメソッドを使用します.
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;
}