Android C代碼回調java方法,android回調

來源:互聯網
上載者:User

Android C代碼回調java方法,android回調

本文將講述下列三種C代碼回調java方法

1、c代碼回調java空方法

2、c代碼回調java int型別參數方法

3、c代碼回調javaString型別參數方法

方法都差不多,先看c代碼回調java空方法,其他兩種類似:

① 找到位元組碼對象 

//jclass (*FindClass)(JNIEnv*, const char*);

//第二個參數 要回調的java方法所在的類的路徑 "com/itheima/callbackjava/JNI"

② 通過位元組碼對象找到方法對象

//jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);

第二個參數 位元組碼對象 第三個參數 要反射調用的java方法名 第四個參數 要反射調用的java方法簽名

javap -s 要擷取方法簽名的類的全類名 項目/bin/classes 運行javap

③ 通過位元組碼建立 java對象(可選) 如果本地方法和要回調的java方法在同一個類裡可以直接用 jni傳過來的java對象 調用建立的Method

jobject obj =(*env)->AllocObject(env,claz);

當回調的方法跟本地方法不在一個類裡 需要通過剛建立的位元組碼對象手動建立一個java對象

再通過這個對象來回調java的方法

需要注意的是 如果建立的是一個activity對象 回調的方法還包含上下文 這個方法行不通!!!回報null 指標異常

④ 反射調用java方法

//void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);

第二個參數 調用java方法的對象 第三個參數 要調用的jmethodID對象 可選的參數 調用方法時接收的參數

接下來實戰項目實現

建立項目,布局如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context=".MainActivity" >    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:onClick="callbackvoid"        android:text="回調null方法" />    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:onClick="callbackint"        android:text="回調int參數方法" />    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:onClick="callbackString"        android:text="回調String參數方法" /></LinearLayout>

建立JNI.java

package com.wuyudong.callbackjava;public class JNI {        static{        System.loadLibrary("callback");    }    public native void callbackvoidmethod();        public native void callbackintmethod();        public native void callbackStringmethod();    // C調用java空方法    public void helloFromJava() {        System.out.println("hello from java");    }    // C調用Java中的帶兩個int參數的方法    public int add(int x, int y) {        return x + y;    }    // C調用java中參數為String的方法    public void printString(String s) {        System.out.println(s);    }}

MainActivity.java

package com.wuyudong.callbackjava;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.view.View;public class MainActivity extends Activity {        JNI jni;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        jni = new JNI();    }    public void callbackvoid(View v) {        jni.callbackvoidmethod();    }            public void callbackint(View v) {        jni.callbackintmethod();    }        public void callbackString(View v) {        jni.callbackStringmethod();    }}

callback.c

#include <jni.h>#include <android/log.h>#define LOG_TAG "System.out"#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)JNIEXPORT void JNICALL Java_com_wuyudong_callbackjava_JNI_callbackvoidmethod(        JNIEnv * env, jobject clazz) {    //1、擷取位元組碼對象 jclass (*FindClass)(JNIEnv*, const char*);    jclass claz = (*env)->FindClass(env, "com/wuyudong/callbackjava/JNI");    //2、擷取Method對象 jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);    jmethodID methodID = (*env)->GetMethodID(env, claz, "helloFromJava", "()V");    //3、通過位元組碼對象建立一個Object(即是clazz)    //4、通過對象調用方法    (*env)->CallVoidMethod(env, clazz, methodID);}JNIEXPORT void JNICALL Java_com_wuyudong_callbackjava_JNI_callbackintmethod(        JNIEnv * env, jobject clazz) {    //1、擷取位元組碼對象 jclass (*FindClass)(JNIEnv*, const char*);    jclass claz = (*env)->FindClass(env, "com/wuyudong/callbackjava/JNI");    //2、擷取Method對象 jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);    jmethodID methodID = (*env)->GetMethodID(env, claz, "add", "(II)I");    //3、通過位元組碼對象建立一個Object(即是clazz)    //4、通過對象調用方法    int result = (*env)->CallIntMethod(env, clazz, methodID, 3, 5);    LOGD("result = %d", result);}JNIEXPORT void JNICALL Java_com_wuyudong_callbackjava_JNI_callbackStringmethod(        JNIEnv * env, jobject clazz) {    //1、擷取位元組碼對象 jclass (*FindClass)(JNIEnv*, const char*);    jclass claz = (*env)->FindClass(env, "com/wuyudong/callbackjava/JNI");    //2、擷取Method對象 jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);    jmethodID methodID = (*env)->GetMethodID(env, claz, "printString",            "(Ljava/lang/String;)V");    //3、通過位元組碼對象建立一個Object(即是clazz)    //4、通過對象調用方法    //char* str = "hello from c!";    jstring result = (*env)->NewStringUTF(env, "hello from c");    (*env)->CallVoidMethod(env, clazz, methodID, result);}

擷取更多C語言與演算法相關知識,關注公眾號:“csuanfa”

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.