前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android的JNI【实战教程】4⃣️--C调用Java代码

Android的JNI【实战教程】4⃣️--C调用Java代码

作者头像
先知先觉
发布2019-01-21 14:37:48
6230
发布2019-01-21 14:37:48
举报

基本流程

非静态方法

得到字节码 (FindClass) 得到方法(GetMethodID) 实例化该类(AllocObject) 调用方法(CallIntMethod)

静态方法

得到字节码 (FindClass) 得到方法(GetStaticMethodID) 调用方法(CallStaticVoidMethod) 调用的静态方法

非静态方法

C代码调JAVA类中的addInt(int a, int b)方法

java代码:

代码语言:javascript
复制
    public int addInt(int a, int b){
        int c = a+ b ;
        Toast.makeText(MainApplication.getContext(),"计算结果:::"+c, Toast.LENGTH_SHORT).show();
        return a+b;
    }

.h代码:

代码语言:javascript
复制
JNIEXPORT void JNICALL
Java_com_libin_factory_ndk_NDK_ccallBackAddInt
   (JNIEnv *env, jclass type);

c++代码:

代码语言:javascript
复制
/**
 * C代码调JAVA类中的addInt(int a, int b)方法
 */
JNIEXPORT void JNICALL
Java_com_libin_factory_ndk_NDK_ccallBackAddInt(JNIEnv *env, jclass type) {
    //得到字节码
    jclass jclazz = env->FindClass("com/libin/factory/ndk/Test"); //com.libin.factory.ndk.TestK 点换成下滑线
    //得到方法
    jmethodID jmethodIDS = env->GetMethodID(jclazz,"addInt","(II)I");
    //实例化该类
    jobject jobj = env->AllocObject(jclazz);
    //调用方法
    jint value =env->CallIntMethod(jobj,jmethodIDS,99,1);

    LOGE("value = %d\n" ,value);
}
}

调用:

代码语言:javascript
复制
NDK.ccallBackAddInt();

展示:

这里写图片描述
这里写图片描述

C代码调JAVA类中的addInt(int a, int b)方法

java代码:

代码语言:javascript
复制
    public void setStrings(String s){
        Toast.makeText(MainApplication.getContext(), s, Toast.LENGTH_SHORT).show();
    }

.h代码:

代码语言:javascript
复制
JNIEXPORT void JNICALL
Java_com_libin_factory_ndk_NDK_ccallBackGetString
        (JNIEnv *env, jclass type);

c++代码:

代码语言:javascript
复制
/**
* C代码调JAVA类中的setStrign(String s)方法
*/
JNIEXPORT void JNICALL
Java_com_libin_factory_ndk_NDK_ccallBackGetString(JNIEnv *env, jclass type) {
    //得到字节码
    jclass jclazz = env->FindClass("com/libin/factory/ndk/Test"); //com.libin.factory.ndk.TestK 点换成下滑线
    //得到方法
    jmethodID jmethodIDS = env->GetMethodID(jclazz,"setStrings","(Ljava/lang/String;)V");
    //实例化该类
    jobject jobj = env->AllocObject(jclazz);
    //调用方法
    jstring str = env->NewStringUTF("hello 我是C,我在调用java方法");

    env->CallVoidMethod(jobj,jmethodIDS,str);

}

调用:

代码语言:javascript
复制
 NDK.ccallBackGetString();

展示:

这里写图片描述
这里写图片描述

静态方法

C代码调JAVA类中静态的addInt(int a, int b)方法

java代码:

代码语言:javascript
复制
    public static int addIntS(int a, int b){
        int c = a+ b ;
        Toast.makeText(MainApplication.getContext(), "计算结果:::"+c, Toast.LENGTH_SHORT).show();
        return a+b;
    }

.h代码:

代码语言:javascript
复制
JNIEXPORT void JNICALL
Java_com_libin_factory_ndk_NDK_ccallBackAddIntS
        (JNIEnv *env, jclass type) ;

c++代码:

代码语言:javascript
复制
/**
* C代码调JAVA类中的的addInt(int a, int b)静态方法
*/
JNIEXPORT void JNICALL
Java_com_libin_factory_ndk_NDK_ccallBackAddIntS(JNIEnv *env, jclass type) {
    //得到字节码
    jclass jclazz = env->FindClass("com/libin/factory/ndk/Test"); //com.libin.factory.ndk.TestK 点换成下滑线
    //得到方法
    jmethodID jmethodIDS = env->GetStaticMethodID(jclazz,"addIntS","(II)I");
//    //实例化该类  (静态方法无需实例化该类)
//    jobject jobj = env->AllocObject(jclazz);
    //调用方法
    jint value =env->CallStaticIntMethod(jclazz,jmethodIDS,99,1);
    LOGE("value = %d\n" ,value);
}

调用:

代码语言:javascript
复制
 NDK.ccallBackAddIntS();

展示:

这里写图片描述
这里写图片描述

静态方法

C代码调JAVA类中的setStringsS(String s)静态方法

java代码:

代码语言:javascript
复制
     public static void setStringsS(String s){
        Toast.makeText(MainApplication.getContext(), s, Toast.LENGTH_SHORT).show();
    }

.h代码:

代码语言:javascript
复制
JNIEXPORT void JNICALL
Java_com_libin_factory_ndk_NDK_ccallBackGetStringS
        (JNIEnv *env, jclass type);

c++代码:

代码语言:javascript
复制
/**
* C代码调JAVA类中的setStringsS(String s)静态方法
*/
JNIEXPORT void JNICALL
Java_com_libin_factory_ndk_NDK_ccallBackGetStringS(JNIEnv *env, jclass type) {
    //得到字节码
    jclass jclazz = env->FindClass("com/libin/factory/ndk/Test"); //com.libin.factory.ndk.TestK 点换成下滑线
    //得到方法
    jmethodID jmethodIDS = env->GetStaticMethodID(jclazz,"setStringsS","(Ljava/lang/String;)V");
//    //实例化该类 (静态方法无需实例化该类)
//    jobject jobj = env->AllocObject(jclazz);
    //调用方法
    jstring str = env->NewStringUTF("hello 我是C,我在调用java的静态方法方法");
    env->CallStaticVoidMethod(jclazz,jmethodIDS,str);
}

调用:

代码语言:javascript
复制
NDK.ccallBackGetStringS();

展示:

这里写图片描述
这里写图片描述

对象的调用

C调java创建Student信息

java代码: student类

代码语言:javascript
复制
     public class Student {
    private String name;
    private int age;
    private List<People> peopleList;
    public Student(){}
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "name --- >" + name + "  age --->" + age ;
    }
}

.h代码:

代码语言:javascript
复制
/*
 * Class:     com_libin_factory_ndk_NDK
 * Method:    getStudentInfo
 * Signature: ()Lcom/libin/factory/ndk/Student;
 */
JNIEXPORT jobject JNICALL Java_com_libin_factory_ndk_NDK_getStudentInfo
  (JNIEnv *, jclass);

c++代码:

代码语言:javascript
复制
/**
 * 创建Student信息
 */
JNIEXPORT jobject JNICALL
Java_com_libin_factory_ndk_NDK_getStudentInfo(JNIEnv *env, jclass type) {
    //com.libin.factory.ndk.Student 要把 . 替换成 /
    //关于包描述符,这儿是 com/libin/factory/ndk/Student 要用全类名
    jclass stucls = env->FindClass("com/libin/factory/ndk/Student"); //或得Student类引用

    //获得该类型的构造函数  函数名为 <init> 返回类型必须为 void 即 V
    jmethodID constrocMID = env->GetMethodID(stucls, "<init>", "(Ljava/lang/String;I)V");

    jstring str = env->NewStringUTF("Student named Aly");

    jobject stu_ojb = env->NewObject(stucls, constrocMID, str, 25);  //构造一个对象,调用该类的构造函数,并且传递参数

    return stu_ojb;

}

调用:

代码语言:javascript
复制
Toast.makeText(JNIActivity.this, "Student信息 :" + NDK.getStudentInfo().toString(), Toast.LENGTH_SHORT).show();

展示:

这里写图片描述
这里写图片描述

C调java跟新Student信息

java代码: student类

代码语言:javascript
复制
     public class Student {
    private String name;
    private int age;
    private List<People> peopleList;
    public Student(){}
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "name --- >" + name + "  age --->" + age ;
    }
}

.h代码:

代码语言:javascript
复制
/*
 * Class:     com_libin_factory_ndk_NDK
 * Method:    updateStudentInfo
 * Signature: (Lcom/libin/factory/ndk/Student;)Lcom/libin/factory/ndk/Student;
 */
JNIEXPORT jobject JNICALL Java_com_libin_factory_ndk_NDK_updateStudentInfo
  (JNIEnv *, jclass, jobject);

c++代码:

代码语言:javascript
复制
/**
 * 跟新Student信息
 */
JNIEXPORT jobject JNICALL
Java_com_libin_factory_ndk_NDK_updateStudentInfo
        (JNIEnv *env, jclass type, jobject obj) {

    jclass clazz;
    jfieldID fid;
    jstring j_str;
    jstring j_newStr;

    clazz = env->GetObjectClass(obj);
    if (clazz == NULL) {
        return NULL;
    }
    fid = env->GetFieldID(clazz, "name", "Ljava/lang/String;");
    if (clazz == NULL) {
        return NULL;
    }
    j_str = (jstring) (env)->GetObjectField(obj, fid);
    j_newStr = (env)->NewStringUTF("This is New Name hahah");
    (env)->SetObjectField(obj, fid, j_newStr);
    // 删除局部引用
    (env)->DeleteLocalRef(clazz);
    (env)->DeleteLocalRef(j_str);
    (env)->DeleteLocalRef(j_newStr);
    return obj;

}

调用:

代码语言:javascript
复制
Toast.makeText(JNIActivity.this, "Student信息 :" + NDK.updateStudentInfo(NDK.getStudentInfo()), Toast.LENGTH_SHORT).show();

展示:

这里写图片描述
这里写图片描述

下一篇我们介绍一下AS 2.2 以上配置NDK —-纵享丝滑 http://blog.csdn.net/github_33304260/article/details/71404510

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年05月05日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基本流程
  • 非静态方法
    • C代码调JAVA类中的addInt(int a, int b)方法
      • C代码调JAVA类中的addInt(int a, int b)方法
      • 静态方法
        • C代码调JAVA类中静态的addInt(int a, int b)方法
        • 静态方法
          • C代码调JAVA类中的setStringsS(String s)静态方法
          • 对象的调用
            • C调java创建Student信息
              • C调java跟新Student信息
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档