jni操作jobject
一、 注册JNI函数
1、 静态方法
一般使用javah进行编译,生成很长的文件名和函数名字,这个书写不方便,影响运行效率。
2、 动态注册
使用JNINativeMethod的结构,定义如下:
typedef struct {
const char* name; //java中函数的名字,不带包路径
const char* signature ; //java函数的签名信息
void * fnPtr; //JNI层对应函数的函数指针
}JNINativeMethod;
AndroidRunTime类提供了一个registerNativeMethods函数来完成注册工作。
当java通过System.loadLibrary加载完JNI动态库后,紧接着会查找库中一个叫做JNI_OnLoad的函数,如果有就调用它,而自动注册工作就在这里完成了。
二、通过JNIEnv操作jobject
1、 jfieldID 和 jmethodID 表示java类的成员变量和成员函数
jfieldID GetFieldID(jclass clazz, const char* name , const char *sig);
jmethodID GetMethodID(jclass clazz, const char* name, const char* sig);
其中 jclass代表java类
name表示成员函数或者变量名
sig这个为函数和变量的签名信息
如果每次操作jobject都去查询jmethodID或者jfieldID会影响程序的运行效率,所以我们在初始化的时候将ID保存起来供后续使用。
2、使用jfieldID和jmethodID
代码如下:
通过JNIEnv输出CallVoidMethod的函数,如下:
其中type对应java函数的返回值类型,例如:CallIntMethod,CallVoidMethod等。
上面针对的是非static函数,如果想掉用java中的static函数,则JNIEnv输出CallStatic<type>Method系列函数。
通过jfieldID操作成员变量,如下:
三、函数签名
Java支持函数重载,可以定义同名但是不同参数的函数,但仅仅更具函数名是无法找到具体的函数,jni中将参数和返回值类型组合作为一个函数的签名信息,有了签名信息就可以找到java中的函数了。
虽然函数签名很容易写错,但是java提供了一个javap的工具,帮助函数或变量生成签名信息,用法如下:
javap –s -p XXX
其中XXX为编译后的class文件,s表示内部数据类型的签名信息,P表示打印所有的函数和成员的签名信息,默认只会打印public成员函数和函数的签名信息。
jni操作jobject的更多相关文章
- Android NDK开发 JNI操作java构造方法,普通方法,静态方法(七)
Android NDK开发 JNI操作java普通.静态.构造方法 1.Jni实例化一个Java类的实例jobject 1.通过FindClas( ),获取Java类的的jclass 2.通过GetM ...
- JNI操作二维数组
之前的文章讲解了有关JNI使用方法,这篇文章进阶一点,介绍下JNI操作二维数组的方法.有了之前文章的操作JNI的方法,这里直接上代码了. Java代码部分 package com.testjni; p ...
- 操作JNI函数以及复杂对象传递
转自:http://blog.csdn.net/qinjuning/article/details/7607214 在掌握了JNI函数的使用和相关类型的映射后,以及知晓何利用javah工具生成对应的j ...
- JNI学习积累之三 ---- 操作JNI函数以及复杂对象传递
本文原创,转载请注明出处:http://blog.csdn.NET/qinjuning 在掌握了JNI函数的使用和相关类型的映射后,以及知晓何利用javah工具生成对应的jni函数以及如何生成动态 链 ...
- Java Native Interface 四--JNI中引用类型
本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 JNI支持将类实例和数组类型(如jobjec ...
- NDK-JNI实战教程(二) JNI官方中文资料
声明 设计概述 JNI接口函数和指针 加载和链接本地方法 解析本地方法名 本地方法的参数 引用Java对象 全局和局部引用 实现局部引用 访问Java对象 访问基本类型数组 访问域和方法 报告编程错误 ...
- Android NDK开发之Jni调用Java对象
https://my.oschina.net/zhiweiofli/blog/114064 通过使用合适的JNI函数,你可以创建Java对象,get.set 静态(static)和 实例(instan ...
- JNI编程,C++调用Java
本地代码中使用Java对象 通过使用合适的JNI函数,你可以创建Java对象,get.set 静态(static)和 实例(instance)的域,调用静态(static)和实例(instance)函 ...
- 一天掌握Android JNI本地编程 快速入门
一.JNI(Java Native Interface) 1.什么是JNI: JNI(Java Native Interface):java本地开发接口 ...
随机推荐
- Web 存储
Web Storage 介绍 Web storage 是在web上存储数据的功能,这里的存储是针对客户端来说的. 具体说分为两种: seesionStorage 数据存储在 session 对象中.s ...
- PHP 面向对象编程和设计模式 (3/5) - 单例模式和工厂模式
PHP高级程序设计 学习笔记 2014.06.11 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容 ...
- 2. SVM线性分类器
在一个线性分类器中,可以看到SVM形成的思路,并接触很多SVM的核心概念.用一个二维空间里仅有两类样本的分类问题来举个小例子.如图所示 和是要区分的两个类别,在二维平面中它们的样本如上图所示.中间的直 ...
- springmvc+jpa实现分页的两种方式
1.工具类 public final class QueryTool { public static PageRequest buildPageRequest(int pageNumber, int ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(50)-Easyui 扁平化皮肤
最近抽了点时间仿做了点皮肤,只供欣赏!扁平化
- php json_encode数据格式化
在用ajax与后台交互数据的时候,后台传回来的数据格式不正确,后参考@傲雪星枫的博客在PHP文件添加了一段代码 :echo json_encode($arr); 成功解决.
- 挑子学习笔记:对数似然距离(Log-Likelihood Distance)
转载请标明出处:http://www.cnblogs.com/tiaozistudy/p/log-likelihood_distance.html 本文是“挑子”在学习对数似然距离过程中的笔记摘录,文 ...
- 不太被人提起的%%lockres%%的妙用
%%lockres%% 这个值似乎很少被大家提到,甚至微软在官方文档中. 它返回是一个Hash Value,看乎这个值没什么用. 后来在实践也有它的妙用之处,比如在出现性能问题如LOCK时,一般先通过 ...
- 安卓v7支持包下的ListView替代品————RecyclerView
RecyclerView这个控件也出来很久了,相信大家也学习的差不多了,如果还没学习的,或许我可以带领大家体验一把这个艺术般的控件. 项目已经同步至github:https://github.com/ ...
- 安卓Design包之AppBar和Toolbar的联用
前面讲了Design包的的CoordinatorLayout和SnackBar的混用,现在继续理解Design包的AppBar; AppBarLayout跟它的名字一样,把容器类的组件全部作为AppB ...