当前位置: 首页 > news >正文

Android NDK JNI与Java的相互调用

一、Jni调用Java代码


jni可以调用java中的方法和java中的成员变量,因此JNIEnv定义了一系列的方法来帮助我们调用java的方法和成员变量。


以上就是jni调用java类的大部分方法,如果是静态的成员变量和静态方法,可以使用***GetStaticMethodID、CallStaticObjectMethod等***。就是在上述表格中的相应方法中加个static。

上述中有一个重要的点就是:构造方法的方法id获取,GetMethodID第二个参数传***"< init >"***,这个是固定写法,不能变

上述中还有一个重要的点就是:方法签名(GetFieldID,GetMethodID中的需要的sig参数),这玩意需要记住的,如果记不住,可以通过 javap -s -p 命令去获取,关于javap命令不多说了,下面给一个实例命令行:

javap -s -p E:\1_Study_Space\6_JNI\2_JNI\app\build\intermediates\classes\debug\tsw\demo\a2_jni\Student.class

下面是jni调用java类方法的实例代码

//jni调用java方法
public native void jniCallJava();

public class Student {
    public String name;
    public String sex;

    public Student() {

    }

    public Student(String name, String sex) {
        this.name = name;
        this.sex = sex;
    }

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

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                '}';
    }
}


extern "C"
JNIEXPORT void JNICALL
Java_tsw_demo_a2_1jni_TestJni_jniCallJava(JNIEnv *env, jobject instance) {
    //------------------通过无参构造获取Student类的对象,同时调用setName方法给对象赋值------------------
    jobject jobj_student;
    jmethodID jmid_tostring;
    //1、获取java类Student的jclass
    jclass jcla_student = env->FindClass("tsw/demo/a2_jni/Student");
    //2、获取Student的无参构造方法id。构造方法第二个参数,固定传 <init>,不能变;第三个参数是方法签名
    jmethodID jmid_student = env->GetMethodID(jcla_student, "<init>", "()V");
    //3、获取student对象
    jobj_student = env->NewObject(jcla_student, jmid_student);
    //4、获取Student类setName方法id。第二个参数是方法名;第三个参数是方法签名
    jmethodID jmid_setname = env->GetMethodID(jcla_student, "setName", "(Ljava/lang/String;)V");
    //5、调用Student类setName方法。因为Student的setName是void类型,所以用CallVoidMethod。
    //java类的方法返回什么类型,就用相应类型的Call<Type>Method方法。Call<Type>Method表示CallVoidMethod、CallLongMethod、CallObjectMethod等。
    env->CallVoidMethod(jobj_student, jmid_setname, env->NewStringUTF("zhangsan"));

    //6、调用Student的toString方法
    jmid_tostring = env->GetMethodID(jcla_student, "toString", "()Ljava/lang/String;");
    jstring j_tostring = (jstring) env->CallObjectMethod(jobj_student, jmid_tostring);
    LOGE("setName方法给对象赋值: %s", env->GetStringUTFChars(j_tostring, JNI_FALSE));

    //--------------通过有参构造&#

http://www.lryc.cn/news/145342.html

相关文章:

  • 装备制造企业如何执行精益管理?
  • PHP8中自定义函数-PHP8知识详解
  • 虚拟化技术:云计算发展的核心驱动力
  • 光伏+旅游景区
  • 手搓文本向量数据库(自然语言搜索生成模型)
  • EVO大赛是什么
  • linux中使用clash代理
  • Kafka3.0.0版本——Follower故障处理细节原理
  • 13.redis集群、主从复制、哨兵
  • linux字符串处理
  • Nginx入门——Nginx的docker版本和windows版本安装和使用 代理的概念 负载分配策略
  • Zebec Protocol:模块化 L3 链 Nautilus Chain,深度拓展流支付体系
  • Oracle-rolling upgrade升级19c
  • Spring IOC详解
  • Unity——DOTween插件使用方法简介
  • 数据库——Redis 单线程模型详解
  • leetcode 567. 字符串的排列(滑动窗口-java)
  • Git —— 分支重命名操作
  • JavaIO流
  • FlinkSql 如何实现数据去重?
  • 机器学习概念
  • 【数据结构】排序(插入、选择、交换、归并) -- 详解
  • 游戏中的图片打包流程,免费的png打包plist工具,一款把若干资源图片拼接为一张大图的免费工具
  • Springboot实现ENC加密
  • nginx 托管vue项目配置
  • Vue3中如何进行封装?—组件之间的传值
  • 实训笔记8.25
  • vue自定义监听元素宽高指令
  • 网络爬虫到底是个啥?
  • 前端行级元素和块级元素的基本区别