Android_JNI编程入门
最权威的文档请见JNI
一、JNI概述
在某些情况下,单独使用Java编程无法满足开发者的需求,这时可以使用JNI(Java Native Interface)来处理。常见的需要使用JNI的场景有:
(1)标准Java类库不支持应用程序所需的平台相关特性。
(2)存在其他语言编写的库,并且希望通过JNI使Java代码能够使用该库。
(3)用低级语言(如汇编)实现一小部分时间关键型代码。
通过JNI编程,可以使用native methods做到:
(1)创建、检查和更新Java对象(包括数组和字符串)。
(2)调用Java方法。
(3)捕获并抛出异常。
(4)加载类并获取类信息。
(5)执行运行时类型检查。
二、JNI类型对应
2.1 基础类型
2.2 引用类型
在C++中:
class _jobject {};
class _jclass : public _jobject {};
// ...
typedef _jobject *jobject;
typedef _jclass *jclass;
2.3 值类型
typedef union jvalue {jboolean z;jbyte b;jchar c;jshort s;jint i;jlong j;jfloat f;jdouble d;jobject l;
} jvalue;
2.4 类型签名
对于以下Java方法:
long f (int n, String s, int[] arr);
具有如下签名(signature):
(ILjava/lang/String;[I)J
三、JNI函数操作
JNI方法列表请见:Interface Function Table
(1)其中有对象操作方法如:
jobject NewObjectV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
其中参数:
env: JNI 接口指针,不能为null
clazz: Java类对象的引用,不能为null
methodID: 构造函数的MethodID,可以通过GetMethodID()获得
(2)其中有对象Fileld 访问方法如:
jfieldID GetFieldID(JNIEnv *env, jclass clazz, const char *name, const char *sig);
其中参数:
env: JNI 接口指针,不能为null
clazz: Java类对象,不能为null
name: 字段名的UTF-8 string, 不能为null
sig: 字段签名的UTF-8 string, 不能为null
…方法较多就不再继续罗列。
四、native方法注册
JVM有两种方法来查找native方法并将其与Java代码链接。第一种方法是以特定的命名方式命名native 函数,以便JVM能够找到它。另一种方法是使用JNI RegisterNatives()方法,RegisterNatives()使用作为参数传递的类注册本机方法。通过使用这种方法,我们可以随意命名C++函数。java.lang.Object的registerNatives()方法使用了第二种方法。让我们看看C语言中OpenJDK 8中java.lang.Object的registerNatives()方法实现:
static JNINativeMethod methods[] = {{"hashCode", "()I", (void *)&JVM_IHashCode},{"wait", "(J)V", (void *)&JVM_MonitorWait},{"notify", "()V", (void *)&JVM_MonitorNotify},{"notifyAll", "()V", (void *)&JVM_MonitorNotifyAll},{"clone", "()Ljava/lang/Object;", (void *)&JVM_Clone},
};JNIEXPORT void JNICALL
Java_java_lang_Object_registerNatives(JNIEnv *env, jclass cls)
{(*env)->RegisterNatives(env, cls,methods, sizeof(methods)/sizeof(methods[0]));
}
五、使用JNI例子
public class RegisterNativesHelloWorldJNI {public native void register();public native String sayHello();public static void main(String[] args) {RegisterNativesHelloWorldJNI helloWorldJNI = new RegisterNativesHelloWorldJNI();helloWorldJNI.register();helloWorldJNI.sayHello();}
}
//c++注册实现
static JNINativeMethod methods[] = {{"sayHello", "()Ljava/lang/String;", (void*) &hello },
};JNIEXPORT void JNICALL Java_com_baeldung_jni_RegisterNativesHelloWorldJNI_register (JNIEnv* env, jobject thsObject) {jclass clazz = env->FindClass("com/baeldung/jni/RegisterNativesHelloWorldJNI");(env)->RegisterNatives(clazz, methods, sizeof(methods)/sizeof(methods[0]));
}JNIEXPORT jstring JNICALL hello (JNIEnv* env, jobject thisObject) {std::string hello = "Hello from registered native C++ !!";std::cout << hello << std::endl;return env->NewStringUTF(hello.c_str());
}
打印:
Hello from registered native C++ !!
Android_JNI编程入门相关推荐
- python编程求圆的面积案例_Python实用案例编程入门:第七章 调式手段
本章的主题为调试手段,这是程序开发必不可少的步骤,也是占用时间最多的环节.在程序员的正常开发工作中,调试工作至少占据1/3的时间,而实际编码工作相对占用实际比较少.因此,无论您是初学者,还是编程兴趣爱 ...
- 《C++游戏编程入门(第4版)》——1.12 习题
本节书摘来自异步社区出版社<C++游戏编程入门(第4版)>一书中的第1章,第1.1节,作者:[美]Michael Dawson(道森),更多章节内容可以访问云栖社区"异步社区&q ...
- 编程入门到进大厂,你需要这套学习架构
我相信大多数学习编程的同学都有着对大公司的憧憬.技术.声望.薪资.福利,这些都足以成为吸引你进入大厂的理由. 但是,如何进入大厂呢? 对于很多同学来说,通往大厂的道路并不明朗,不知道是否有希望,也不知 ...
- 《C++游戏编程入门(第4版)》——1.8 Lost Fortune简介
本节书摘来自异步社区出版社<C++游戏编程入门(第4版)>一书中的第1章,第1.8节,作者:[美]Michael Dawson(道森),更多章节内容可以访问云栖社区"异步社区&q ...
- [译]函数式响应编程入门指南
原文地址:An Introduction to Functional Reactive Programming 原文作者:Daniel Lew 译文出自:掘金翻译计划 本文永久链接:github.co ...
- 《C++游戏编程入门(第4版)》——2.4 使用带else子句的if语句序列
本节书摘来自异步社区出版社<C++游戏编程入门(第4版)>一书中的第2章,第2.4节,作者:[美]Michael Dawson(道森),更多章节内容可以访问云栖社区"异步社区&q ...
- 《树莓派Python编程入门与实战》——3.5 关于Python交互式shell
本节书摘来异步社区<树莓派Python编程入门与实战>一书中的第3章,第3.5节,作者:[美]Richard Blum,更多章节内容可以访问云栖社区"异步社区"公众号查 ...
- 编程指南_今晚7点,译者编程入门指南抽奖!
各位关注"简言"的同学们好.老师们! 我的新书<译者编程入门指南>出版啦!感谢大家一直以来的支持和陪伴,我每次发完文章后都会得到大家的点赞.转发.留言甚至打赏,我感到非 ...
- 《树莓派Python编程入门与实战(第2版)》——3.9 小结
本节书摘来自异步社区<树莓派Python编程入门与实战(第2版)>一书中的第3章,第3.9节,作者[美] Richard Blum Christine Bresnahan,陈晓明 马立新 ...
- 《Java并发编程入门与高并发面试》or 《Java并发编程与高并发解决方案》笔记
<Java并发编程入门与高并发面试>or <Java并发编程与高并发解决方案>笔记 参考文章: (1)<Java并发编程入门与高并发面试>or <Java并发 ...
最新文章
- openJDK之sun.misc.Unsafe类CAS底层实现
- 计算机应用基础知识点.pdf,《计算机应用基础》复习知识点.pdf
- flash 遮罩层全解
- QPainter类的CompositionMode各值含义
- DBlink的创建与删除
- 把UltraEdit改造成VC
- VS2012下基于Glut 矩阵变换示例程序2:
- ftp 530 This FTP serveris anonymous only,
- iMeta | 南医大余光创组ggtree最新文章-系统发育树存储与可视化的数据结构
- android开发连接手机usb调试模式,安卓手机usb调试在哪里 安卓手机usb调试模式设置教程...
- Spring Boot Admin
- ORCLE导出数据,加不加owner,ORACLE常用的导出语句
- [从头读历史] 第280节 诗经目录以及十五国风的地域分布
- 骑士cms文件包含getshell复现
- Android存储路径解析
- QA之道知多少(一) 初出茅庐
- IT“茫一代”:35岁成生死线 无处安放未来
- 微信小程序码的生成(JAVA完整版) 亲测可用
- 解读Git与SVN的区别(集中式VS分布式)
- python中使用scipy.integrate求积分、二重积分、三重积分