1. 程式人生 > >android NDK 開發(2)

android NDK 開發(2)

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;
    }
}