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本地开发接口 ...
随机推荐
- Javascript的“上下文”(context)
一:JavaScript中的“上下文“指的是什么 百科中这样定义: 上下文是从英文context翻译过来,指的是一种环境. 在软件工程中,上下文是一种属性的有序序列,它们为驻留在环境内的对象定义环境. ...
- Java:IO流与文件基础
Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...
- 读书笔记--SQL必知必会01--了解SQL
1.1 数据库基础 数据库(datebase) 保存有组织的数据的容器(通常是一个文件或一组文件),是一个以某种有组织的方式存储的数据集合. 数据库管理系统(DBMS,Data Base Manage ...
- 2.C#面向对象基础属性
属性: 1.一般属性开头字母大写,字段开头字母小写. 2.通过public来赋值的方法无法判断赋值是否非法! 3.无论赋值如何,取值如果就是不采用赋值的结果,那么无论赋值什么都不管用. 4.经典错误之 ...
- PHP环境配置
PHP环境配置 1.Apache的安装 第一步: 1. 双击httpd-2.2.17-win32-x86-no_ssl.msi.出现 Windows 标准的软件安装欢迎界面,直接点“Next”继 ...
- Java正则速成秘籍(三)之见招拆招篇
导读 正则表达式是什么?有什么用? 正则表达式(Regular Expression)是一种文本规则,可以用来校验.查找.替换与规则匹配的文本. 又爱又恨的正则 正则表达式是一个强大的文本匹配工具,但 ...
- TCP初始化序列号ISN
TCP初始化序列号ISN TCP初始化序列号不能设置为一个固定值,因为这样容易被攻击者猜出后续序列号,从而遭到攻击. RFC1948中提出了一个较好的初始化序列号ISN随机生成算法. ISN = M ...
- 从零自学Hadoop(20):HBase数据模型相关操作上
阅读目录 序 介绍 命名空间 表 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 序 ...
- WPF 虚拟化 VirtualizingWrapPanel 和 VirtualLizingTilePanel
一. UI 上两个扩展 public class VirtualizingWrapPanel : VirtualizingPanel, IScrollInfo { #region Fields UI ...
- c#生成静态html文件,封装类
由于这段时间比较轻松,于是想到很多的企业网站,新闻网站需要将页面静态化,于是写了个封装类来实现静态文件的生成,思路比较简单,但未完善,网友可根据自己的思路将此类扩展,运用了简单工厂模式(本来刚开始看设 ...