首页 > 编程语言 >ndk开发之native层访问java层

ndk开发之native层访问java层

时间:2023-10-11 21:11:45浏览次数:33  
标签:thiz ndk java clazz 访问 env id native

一.native层访问java层的成员变量

  java层的成员变量可以分为实例变量和静态变量,不过他们的访问方法比较类似,可以分为以下三步:

  1. 获取java类对应的jclass对象
  2. 获取需要访问的成员变量的jfieldID
  3. 根据需要访问的变量的类型,调用setXXXField()/getXXXField()方法来设置/获取成员变量的值

  示例代码如下:

void native_accessNonStaticField(JNIEnv *env,jobject thiz){//访问实例变量
    jclass clazz=env->GetObjectClass(thiz);
    jfieldID id=env->GetFieldID(clazz,"age","I");
    //获取java层age的值
    jint age=env->GetIntField(thiz,id);
    //修改java层age的值
    env->SetIntField(thiz,id,10);
}
void native_accessStaticField(JNIEnv *env,jobject thiz){//访问静态变量
    jclass clazz=env->GetObjectClass(thiz);
    jfieldID id=env->GetStaticFieldID(clazz,"name","Ljava/lang/String;");
    //获取java层name的值
    jstring name= static_cast<jstring>(env->GetStaticObjectField(clazz, id));
    //修改java层name的值
    const char *name1="jack";
    jstring name2=env->NewStringUTF(name1);
    env->SetStaticObjectField(clazz,id,name2);
}

二.native层访问java层的成员方法

  同样的java层的成员方法也分为实例方法和静态方法,它们的访问方式也很类似,可以分为以下三个步骤:

  1. 获取java类对应的jclass对象
  2. 获取需要访问的成员方法的jmethodID
  3. 接着就可以调用CallXXXMethod()/CallStaticXXXMethod()方法访问相应的方法

  示例代码如下:

void native_accessNonStaticMethod(JNIEnv *env,jobject thiz){//访问实例方法
    jclass clazz=env->GetObjectClass(thiz);
    //实例化对象
    jmethodID constructor_method_id=env->GetMethodID(clazz,"<init>", "()V");
    jobject Test=env->NewObject(clazz,constructor_method_id);
    //调用java层的方法
    const char *str="实例方法";
    jstring str1=env->NewStringUTF(str);
    jmethodID id=env->GetMethodID(clazz,"NonStaticMethod", "(Ljava/lang/String;)V");
    env->CallVoidMethod(Test,id,str1);
    //清理临时引用
    env->DeleteLocalRef(clazz);
    env->DeleteLocalRef(Test);
}
void native_accessStaticMethod(JNIEnv *env,jobject thiz){//访问静态方法
    jclass clazz=env->GetObjectClass(thiz);
    //调用java层的方法
    const char *str="静态方法";
    jstring str1=env->NewStringUTF(str);
    jmethodID id=env->GetStaticMethodID(clazz,"StaticMethod","(Ljava/lang/String;)V");
    env->CallStaticVoidMethod(clazz,id,str1);
    //清理临时引用
    env->DeleteLocalRef(clazz);
}

 三.native层访问java层的一些常用jni方法

   如果要访问其他基本类型的变量或者函数的返回值为其他基本类型时,将Int改为其他基本类型即可。

 

参考:https://juejin.cn/post/7244709476518510629

标签:thiz,ndk,java,clazz,访问,env,id,native
From: https://www.cnblogs.com/luqman/p/Cjava.html

相关文章

  • 深入浅出JavaScript闭包
    什么是JS闭包?JS闭包是一个难点也是JS的特色,是JS的高级特性。首先我们知道JS运行函数的时候会在内存中开辟一个存储空间,会把函数体内的代码当作字符串一摸一样的放在这个空间中,把这个空间地址赋值给函数名(变量名),当我们调用函数的时候会根据地址找到这个储存空间,然后执行储存空......
  • javaweb第7章源码
    javaweb第7章源码:下载链接:https://wwpv.lanzoue.com/iurOS1bijocb文件结构:CHAPTER07│.classpath│.project│├─.settings│.jsdtscope│org.eclipse.jdt.core.prefs│org.eclipse.wst.common.component│org.eclipse.wst.common.proje......
  • Java web 中央控制器
    Javaweb中央控制器mvc-servlet优化beanMap相当于一个容器http://localhost:8080/pro15/fruit.do?operate=edit&fid=2在上面的链接中使用fruit.do找到Controller控制器.然后再通过operate找到edit方法在原本的方法之中我们发现在FruitController的各种方法比如update(),ed......
  • JAVA设计模式——策略模式
    策略模式是一种行为型设计模式,它允许在运行时选择算法的行为。它定义了一系列算法,将每个算法封装起来并使它们可以相互替换。策略模式使算法的变化独立于使用算法的客户端。在策略模式中,我们有一个上下文对象,该对象包含一个指向策略对象的引用。策略对象实现了一个公共接口,该接口......
  • JAVA图搜索算法之DFS-BFS
    图算法DFS与BFSBFS和DFS代表对图进行遍历,即搜索的算法,搜索算法中常用的只要有两种算法:深度优先遍历(Depth-First-Search:DFS)和广度优先遍历(Breadth-First-Search:BFS)。一个图结构可以用来表示大量现实生活中的问题,比如,道路网络,计算机网络,社交网络,用户身份解析图①DFS......
  • Java 导出Excel根据单元格内容计算并设置列宽度、行高
    话不多说,上代码:importorg.apache.poi.ss.usermodel.*;importorg.apache.poi.ss.util.CellRangeAddress;importjava.util.HashMap;importjava.util.Map;importjava.util.Objects;/***根据单元格内容计算并设置列宽度、行高*/publicclassExcelUtil{//......
  • 1——of C++ and Java togather
    因为那个C++最全的笔记是从第18课开始做(笔者说18课之前都很基础),所以这里就对前18课的知识做个笔记总结C++的工作过程这里提到的C++工作过程主要涉及两个:编译与链接之前考研时候学到,(在组成原理的某个章节),计算机的工作过程其实就涉及“将源程序转换成可执行文件”,与其中便......
  • java 后台防止重复提交(注解方式)
    /***自定义注解防止表单重复提交**@authorframework*/@Inherited@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic@interfaceRepeatSubmit{/***间隔时间(ms),小于此时间视为重复提交*/intinterval(......
  • java.lang.IllegalArgumentException: Expected MultipartHttpServletRequest: is a M
    原文链接:https://www.longkui.site/error/java-lang-illegalargumentexception-expected-multiparthttpservletrequest-is-a-multipartresolver-configured/4837/0.背景JAVA后台一个上传excel的接口,如下:importData(@RequestParam("file")MultipartFilefile)然后,前台按......
  • Java程序【生产问题】排查
    1.查看线程数:方法一:查看/proc/[进程ID]/grepThreads/proc/[进程ID]/status方法二:ps-L-opid,tid,comm,state-p[进程ID]2.jstack分析Java堆栈jstack-l[进程ID]3.查看IOeg:如果有toomanyopenfiles的报错,则说明程序打开的文件过多1.查看该进程打开......