美文网首页
Android ndk 中c 调用Java

Android ndk 中c 调用Java

作者: lixinxin | 来源:发表于2017-12-02 15:36 被阅读6次

c调用java 中的方法

c代码中通过反射得到java 对象

1.新建Java类

public class CCallJava {

    static {
        System.loadLibrary("CCallJava");
    }

    public native void callBack();
    public native int callBackForJni();

    public int add(int x, int y) {
        int z = x + y;
        Log.e("CCallJava", "-----x+y="+z);
        return z;
    }
}

2新建C文件

#include <jni.h>

JNIEXPORT jint JNICALL
Java_com_lixinxin_leeroomdemo_jni_CCallJava_callBackForJni(JNIEnv *env, jobject instance) {

    //1.加载类 得到class 对象
    jclass jc = (*env)->FindClass(env, "com/lixinxin/leeroomdemo/jni/CCallJava");
    //2.得到对应方法的 Method 对象
    jmethodID jmethodID1 = (*env)->GetMethodID(env, jc, "add", "(II)I");
    //3.创建对象
    jobject jobject1 = (*env)->AllocObject(env, jc);
    //4.调用方法
    jint z = (*env)->CallIntMethod(env, jobject1, jmethodID1, 99, 1);
    return z;
}

获取Java方法的签名 javap -s 类的全路径

3 调用

 CCallJava cCallJava=new CCallJava();
 textView.setText("结果"+cCallJava.callBackForJni());

4 c 调用java 的静态方法

JNIEXPORT jint JNICALL
Java_com_lixinxin_leeroomdemo_jni_CCallJava_callJavaStatic(JNIEnv *env, jobject instance) {

    //1.加载类 得到class 对象
    jclass jc = (*env)->FindClass(env, "com/lixinxin/leeroomdemo/jni/CCallJava");
    //2.得到对应方法的 Method 对象
    jmethodID jmethodID1 = (*env)->GetStaticMethodID(env, jc, "getStringSize", "(Ljava/lang/String;)I");
    //3.调用方法
    jstring str = (*env)->NewStringUTF(env, "lixinxin");
    jint z = (*env)->CallStaticIntMethod(env, jc,jmethodID1, str);

    return z;
}

相关文章

网友评论

      本文标题:Android ndk 中c 调用Java

      本文链接:https://www.haomeiwen.com/subject/chmnbxtx.html