android NDK 開發(2)
阿新 • • 發佈:2018-12-13
java向native層傳遞引數
1.傳遞基本型別引數,可以直接使用
//Java層定義介面 public native static int sum(int a, int b); //.c檔案native層實現 JNIEXPORT jint JNICALL Java_com_hd_jni_JNITest_sum (JNIEnv *env, jclass jclass1, jint a, jint b) { return a + b; } //activity中測試程式碼 private void testSum() { int sum = JNITest.sum(10, 20); Toast.makeText(JNITestActivity.this, "a+b=" + sum, Toast.LENGTH_LONG).show(); }
2.傳遞複雜型別引數,需要做一定的轉換,如String,Object,Array
(1)傳遞string
//java層定義介面 public native static String testChangeString(String string); //native層實現 JNIEXPORT jstring JNICALL Java_com_hd_jni_JNITest_testChangeString (JNIEnv *env, jclass jclass1, jstring str) { const char *string = (*env)->GetStringUTFChars(env, str, NULL); const char *prefix = "hello "; const char *result = join(prefix, string); (*env)->ReleaseStringUTFChars(env, str, string); return (*env)->NewStringUTF(env, result); } //測試程式碼 private void testChangeString() { String returnstr = JNITest.testChangeString("heihei"); Toast.makeText(JNITestActivity.this, "returnstr=" + returnstr, Toast.LENGTH_LONG).show(); }
(2)傳遞object
//java層定義介面 public native static String studentToString(Student student); //native層實現 JNIEXPORT jstring JNICALL Java_com_hd_jni_JNITest_studentToString (JNIEnv *env, jclass jclass1, jobject obj) { //根據傳入的物件獲得對應的class jclass objClass = (*env)->GetObjectClass(env, obj); //獲得名字 jfieldID nameid = (*env)->GetFieldID(env, objClass, "name", "Ljava/lang/String;"); jstring nameStr = (jstring) (*env)->GetObjectField(env, obj, nameid); const char *name = (*env)->GetStringUTFChars(env, nameStr, NULL); __android_log_write(ANDROID_LOG_DEBUG, "123", name); //獲得性別 jfieldID sexid = (*env)->GetFieldID(env, objClass, "sex", "I"); jint sex = (*env)->GetIntField(env, obj, sexid); char *p = NULL; if (sex == 0) { p = " male"; } else { p = " female"; } //拼裝字串 const char *result = join(name, p); __android_log_write(ANDROID_LOG_DEBUG, "123", result); return (*env)->NewStringUTF(env, result); } char *join(char *s1, char *s2) { char *result = malloc(strlen(s1) + strlen(s2) + 1);//+1 for the zero-terminator // in real code you would check for errors in malloc here if (result == NULL) exit(1); strcpy(result, s1); strcat(result, s2); return result; } //測試程式碼 private void testChangeString() { String returnstr = JNITest.testChangeString("heihei"); Toast.makeText(JNITestActivity.this, "returnstr=" + returnstr, Toast.LENGTH_LONG).show(); }
java物件
package com.hd.jni;
public class Student {
public String name;
public int sex;
public Student(String name, int sex) {
this.name = name;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
}