Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android NDK學習筆記9-JNI調用Java方法

Android NDK學習筆記9-JNI調用Java方法

編輯:關於Android編程

與域一樣,java中有兩類方法:實例方法和靜態方法。JNI提供訪問兩類方法的函數,例如:

public class JavaClass {
// 實例方法
private String instanceMethod(){
return "Instance Method";
}
// 靜態方法
private static String staticMethod(){
return "StaticMethod";
}
}

● 獲取方法ID
JNI提供了用方法ID訪問兩類方法的途徑,可以用給定實例的class對象獲得方法ID。用GetMethodID函數獲得實例方法的方法ID,例如:

jmethodID instanceMethodId;
instanceMethodId = (*env)->GetMethodID(env,clazz,"instanceMethod","()Ljava/lang/String;");

用GetStaticMethodID函數獲得靜態域的方法ID,例如:

jmethodID staticMethodId;
staticMethodId = (*env)->GetStaticMethodID(env,clazz,"staticMethod","()Ljava/lang/String;");

兩個函數的最後一個參數均表示方法描述符,在Java中表示方法簽名。
● 調用方法
可以以方法ID為參數通過CallMethod類函數調用實際的實例方法,例如:
1.調用實例方法

jstring instanceMethodResult;
instanceMethodResult = (*env)->CallStringMethod(env,instance,"instanceMethodId");

2.調用靜態方法

jstring staticMethodResult;
staticMethodResult = (*env)->CallStaticStringMethod(env,clazz,"staticMethodId");

JNI調用Java靜態方法案例

HelloJni.java

public class HelloJni extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        callJavaStaticMethod();
    }

    public native String callJavaStaticMethod();

    static {
        System.loadLibrary("hello-jni");
    }

    // 靜態方法
    private static String staticMethod() {
        return "StaticMethod Castiel";
    }
}

hellojni.c

#include 
#include 
#include 

JNIEXPORT void JNICALL
Java_com_example_hellojni_HelloJni_callJavaStaticMethod(JNIEnv *env, jclass type) {

    jclass jniClass = (*env)->FindClass(env, "com/example/hellojni/HelloJni");
    if (NULL == jniClass) {
        __android_log_print(ANDROID_LOG_INFO,"HelloJni","can't find jclass");
        return;
    }
    jmethodID getMId = (*env)->GetStaticMethodID(env, jniClass, "staticMethod",
                                                              "()Ljava/lang/String;");
    if (NULL == getMId) {
        __android_log_print(ANDROID_LOG_INFO,"HelloJni","can't find method getStringFromStatic from JniClass");
        return;
    }
    jstring result = (*env)->CallStaticObjectMethod(env, jniClass, getMId);
    const char *resultChar = (*env)->GetStringUTFChars(env, result, NULL);
    (*env)->DeleteLocalRef(env, jniClass);
    (*env)->DeleteLocalRef(env, result);
    __android_log_print(ANDROID_LOG_INFO,"HelloJni",resultChar);
}

編譯後執行程序,可以看到日志中成功打印我們獲取的Java方法

這裡寫圖片描述

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved