JNI由淺入深_7_c調用Java方法一

來源:互聯網
上載者:User

標籤:

1、在Java中聲明方法

<span style="font-size:14px;">/** * javah -encoding utf-8 -jni com.example.jniandroid.service.CFunction * 當java中有中文時,會報編碼GBK不可映射字元 方法的調用,加上-encoding utf-8  *  * @author libin *  */public class CFunction {/** * 實現在c裡面回調callback方法 */public native void callJniNative();/** * c調用Java的執行個體方法 */public void callback() {System.out.println("callNative to callback  in Java");}/** * c調用Java的靜態方法 */public static void callbackStatic() {System.out.println("callNative  to callback static  in Java");}}</span>

2、c中調用Java方法2.1 調用執行個體方法

本地方法Java_InstanceMethodCall_nativeMethod的實現示範了在本地代碼中調用JAVA方法的兩步:

1、本地方法首先調用JNI函數GetMethodID。這個函數在指定的類中尋找相應的方法。這個尋找過程是基於方法描述符的。如果方法不存在,GetMethodID返回NULL。這時,立即從本地方法中返回,並引發一個NoSuchMethodError錯誤。

2、  本地方法通過調用CallVoidMethod來調用返回值為void的執行個體方法。

除了CallVoidMethod這個函數以外,JNI也支援對返回值為其它類型的方法的調用。如果你調用的方法返回值類型為int,你的本地方法會使用CallIntMethod。類似地,你可以調用CallObjectMethod來調用返回值為java.lang.String、數組等物件類型的方法。

2.2 調用靜態方法

靜態方法調用功能的JNI系列函數中的一個,如:CallStaticVoidMethod,CallStaticBooleanMethod等。

調用靜態方法和調用執行個體方法的JNI函數有一個很大的不同,前者第二個參數是類引用,後者是對象執行個體的引用。

在JAVA訪問一個靜態方法可以通過類,也可以通過對象執行個體。而JNI的規定是,在本地代碼中回調JAVA中的靜態方法時,必須指定一個類引用才行。

<span style="font-size:14px;">/** * 調用Java的靜態方法和執行個體方法 */JNIEXPORT void JNICALL Java_com_example_jniandroid_service_CFunction_callJniNative(JNIEnv * env, jobject obj) {//調用靜態方法jclass cls = (*env)->GetObjectClass(env, obj);jmethodID callbackStatic = (*env)->GetStaticMethodID(env, cls, "callbackStatic", "()V");(*env)->CallStaticVoidMethod(env, cls, callbackStatic);//調用執行個體方法,先要建立一個對象,然後通過Call<Type>Method方法進行調用jclass instanceFunc = (*env)->FindClass(env, "com/example/jniandroid/service/CFunction");jmethodID construction_id = (*env)->GetMethodID(env, instanceFunc, "<init>","()V");jclass mCFunction = (*env)->NewObject(env, instanceFunc, construction_id);jmethodID callback  = (*env)->GetMethodID(env,instanceFunc,"callback","()V");(*env)->CallVoidMethod(env, mCFunction, callback);}</span>


JNI由淺入深_7_c調用Java方法一

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.