Android學習筆記_JNI_c調用java代碼

來源:互聯網
上載者:User

標籤:android   c   style   class   blog   code   

1、編寫native方法(java2c)和非native方法(c2java):

package com.example.provider;public class CallbackJava {    // C調用java空方法    public void helloFromJava() {        System.out.println("hello from java");    }    // C調用java中的帶兩個int參數的方法    public int Add(int x, int y) {        int result = x + y;        System.out.println("java result=" + result);        return result;    }    // C調用java中參數為string的方法    public void printString(String s) {        System.out.println("java " + s);    }    //靜態方法    public static void printStaticStr(String s) {        System.out.println("java static-> " + s);    }    // 讓c代碼調用對應的java代碼    public native void callHelloFromJava();    public native void callAdd();    public native void callPrintString();    // 調用一個靜態c代碼    public native void callPrintStaticStr();}

2、通過javah命令產生簽名,通過javap命令生產native方法簽名:

  

3、c代碼

FindClass:找到java中的類檔案
GetMethodID:根據類和方法簽名找到要調用的方法。
#include <stdio.h>#include <jni.h>#include <malloc.h>#include "com_example_provider_CallbackJava.h";#include <android/log.h>#define LOG_TAG "System.out.c"#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)jmethodID getMethodId(JNIEnv * env, char* methodname, char* signname) {    jclass jclazz = (*env)->FindClass(env, "com/example/provider/CallbackJava");    if (jclazz == 0) {        LOGD("class not find ");        return;    }    //2、找class中方法的id,第三個參數方法名稱,第四個參數該方法對應的簽名    jmethodID methodid = (*env)->GetMethodID(env, jclazz, methodname, signname);    if (methodid == 0) {        LOGD("method not find ");        return;    }    return methodid;}JNIEXPORT void JNICALL Java_com_example_provider_CallbackJava_callHelloFromJava(JNIEnv * env, jobject obj) {    //1、 找java中的class檔案    //第二個參數是類名的(包名)    jclass jclazz = (*env)->FindClass(env,"com/example/provider/CallbackJava");    if(jclazz==0) {        LOGD("class not find ");        return;    }    //2、找class中方法的id,第三個參數方法名稱,第四個參數該方法對應的簽名    jmethodID methodid = (*env)->GetMethodID(env, jclazz,"helloFromJava","()V");    if(methodid==0) {        LOGD("helloFromJava method not find ");        return;    }    //3、調用方法    //void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);    (*env)->CallVoidMethod(env,obj,methodid);}JNIEXPORT void JNICALL Java_com_example_provider_CallbackJava_callAdd(JNIEnv *env, jobject obj) {    jmethodID mid = getMethodId(env,"Add","(II)I");    int result = (*env)->CallIntMethod(env, obj, mid,3,6);    LOGD("c to java add: d%",result);}JNIEXPORT void JNICALL Java_com_example_provider_CallbackJava_callPrintString(JNIEnv *env, jobject obj) {    LOGD("c to java callPrintString start ");    jmethodID mid = getMethodId(env,"printString","(Ljava/lang/String;)V");    (*env)->CallVoidMethod(env, obj, mid,(*env)->NewStringUTF(env," call printString finish"));    LOGD("c to java callPrintString finish ");}JNIEXPORT void JNICALL Java_com_example_provider_CallbackJava_callPrintStaticStr(JNIEnv *env, jobject obj) {    jclass jclazz = (*env)->FindClass(env, "com/example/provider/CallbackJava");    if (jclazz == 0) {        LOGD("class not find ");        return;    }    //靜態方法調用GetStaticMethodID 和 CallStaticXXXMethod    jmethodID methodid = (*env)->GetStaticMethodID(env, jclazz, "printStaticStr", "(Ljava/lang/String;)V");    if (methodid == 0) {        LOGD("printStaticStr method not find ");        return;    }    (*env)->CallStaticVoidMethod(env, jclazz, methodid,(*env)->NewStringUTF(env,"static hello 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.