一、 注册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、 jfieldIDjmethodID 表示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的更多相关文章

  1. Android NDK开发 JNI操作java构造方法,普通方法,静态方法(七)

    Android NDK开发 JNI操作java普通.静态.构造方法 1.Jni实例化一个Java类的实例jobject 1.通过FindClas( ),获取Java类的的jclass 2.通过GetM ...

  2. JNI操作二维数组

    之前的文章讲解了有关JNI使用方法,这篇文章进阶一点,介绍下JNI操作二维数组的方法.有了之前文章的操作JNI的方法,这里直接上代码了. Java代码部分 package com.testjni; p ...

  3. 操作JNI函数以及复杂对象传递

    转自:http://blog.csdn.net/qinjuning/article/details/7607214 在掌握了JNI函数的使用和相关类型的映射后,以及知晓何利用javah工具生成对应的j ...

  4. JNI学习积累之三 ---- 操作JNI函数以及复杂对象传递

    本文原创,转载请注明出处:http://blog.csdn.NET/qinjuning 在掌握了JNI函数的使用和相关类型的映射后,以及知晓何利用javah工具生成对应的jni函数以及如何生成动态 链 ...

  5. Java Native Interface 四--JNI中引用类型

    本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 JNI支持将类实例和数组类型(如jobjec ...

  6. NDK-JNI实战教程(二) JNI官方中文资料

    声明 设计概述 JNI接口函数和指针 加载和链接本地方法 解析本地方法名 本地方法的参数 引用Java对象 全局和局部引用 实现局部引用 访问Java对象 访问基本类型数组 访问域和方法 报告编程错误 ...

  7. Android NDK开发之Jni调用Java对象

    https://my.oschina.net/zhiweiofli/blog/114064 通过使用合适的JNI函数,你可以创建Java对象,get.set 静态(static)和 实例(instan ...

  8. JNI编程,C++调用Java

    本地代码中使用Java对象 通过使用合适的JNI函数,你可以创建Java对象,get.set 静态(static)和 实例(instance)的域,调用静态(static)和实例(instance)函 ...

  9. 一天掌握Android JNI本地编程 快速入门

    一.JNI(Java Native Interface)        1.什么是JNI:               JNI(Java Native Interface):java本地开发接口   ...

随机推荐

  1. Jquery

    使用时jquery先引进jquery文件包 <script src="jquery-1.11.2.min.js"></script> 一个页面有多个文件jq ...

  2. 学习WCF入门的第一个实例

    一.概述 WCF说白了就是一个基于终结点的通信手段!就是Service端提供一定的功能实现,然后暴露出一个或多个终结点,Client端调用Service端的功能(可以理解为调用一个函数),那么Clie ...

  3. 坎坷路:ASP.NET Core 1.0 Identity 身份验证(中集)

    上一篇:<坎坷路:ASP.NET 5 Identity 身份验证(上集)> ASP.NET Core 1.0 什么鬼?它是 ASP.NET vNext,也是 ASP.NET 5,以后也可能 ...

  4. 从接口、抽象类到工厂模式再到JVM来总结一些问题

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习! 涉及到的知识点总结如下: 为什么使用接口? 接口和抽象类的区别 简单工厂模式总结 Java中new和newInstance的区别 J ...

  5. iOS引入JavaScriptCore引擎框架(一)

    JavaScriptCore引擎     我们都知道WebKit是个渲染引擎,简单来说负责页面的布局,绘制以及层的合成,但是WebKit工程中不仅仅有关于渲染相关的逻辑,也集成了默认的javascri ...

  6. 读书笔记--SQL必知必会--常用MySQL(MariaDB)命令

    DBMS信息 显示DBMS的版本 select version(); 显示DBMS状态 status; 显示DBMS资源状态 show status; 显示DBMS支持的权限 show privile ...

  7. Java进击C#——语法之IO操作

    本章简言 上一章我们对线程同步进行讲解.了解如何去处理可能发生的脏数据.而本章就要讲有关于C#在读取IO文件的时候,常常用到的操作类.这一章的内容会比较少.但是笔者还是总结出来让读者们有一个学习的方向 ...

  8. PowerShell 操作 Azure SQL Active Geo-Replication 实战

    <Azure SQL Database Active Geo-Replication简介>一文中,我们比较全面的介绍了 Azure SQL Database Active Geo-Repl ...

  9. C++四种类型转换方式。

    类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可以在任意类型之间转换,比 ...

  10. C#开发微信门户及应用(1)--开始使用微信接口

    微信应用如火如荼,很多公司都希望搭上信息快车,这个是一个商机,也是一个技术的方向,因此,有空研究下.学习下微信的相关开发,也就成为日常计划的重要事情之一了.本系列文章希望从一个循序渐进的角度上,全面介 ...