[Chromium文档转载,第007章]JNI on Chromium for Android
Overview
JNI (Java Native Interface) is the mechanism that enables Java code to call native functions, and native code to call Java functions.
- Native code calls into Java using apis from
<jni.h>, which basically mirror Java's reflection APIs. - Java code calls native functions by declaring body-less functions with the
nativekeyword, and then calling them as normal Java functions.
jni_generator generates boiler-plate code with the goal of making our code:
- easier to write, and
- typesafe.
jni_generator uses regular expressions to parse .Java files, so don't do anything too fancy. E.g.:
- Classes must be either explicitly imported, or are assumed to be in the same package. To use
java.langclasses, add an explicit import. - Inner classes need to be referenced through the outer class. E.g.:
void call(Outer.Inner inner)
The presense of any JNI within a class will result in ProGuard obfuscation for the class to be disabled.
Exposing Native Methods
Without Crazy Linker:
- Java->Native calls are exported from the shared library and lazily resolved by the runtime (via
dlsym()).
With Crazy Linker:
- Java->Native calls are explicitly registered with JNI on the native side. Explicit registration is necessary because crazy linker provides its own
dlsym(), but JNI is hardcoded to use the system'sdlsym().- The logic to explicitly register stubs is generated by
jni_registration_generator.py.- This script finds all native methods by scanning all source
.javafiles of an APK. Inefficient, but very convenient.
- This script finds all native methods by scanning all source
- Since
dlsym()is not used in this case, we use a linker script to avoid the cost of exporting symbols from the shared library (refer to//build/config/android:hide_all_but_jni_onload).
- The logic to explicitly register stubs is generated by
jni_registration_generator.pyexposes two registrations methods:RegisterNonMainDexNatives- Registers native functions needed by multiple process types (e.g. Rendereres, GPU process).RegisterMainDexNatives- Registers native functions needed only by the browser process.
Exposing Java Methods
Java methods just need to be annotated with @CalledByNative. The generated functions can be put into a namespace using @JNINamespace("your_namespace").
Usage
Because the generator does not generate any source files, generated headers must not be #included by multiple sources. If there are Java functions that need to be called by multiple sources, one source should be chosen to expose the functions to the others via additional wrapper functions.
Calling Java -> Native
- Methods marked as
nativewill have stubs generated for them that forward calls to C++ function (that you must write). - If the first parameter is a C++ object (e.g.
long mNativePointer), then the bindings will automatically generate the appropriate cast and call into C++ code (JNI itself is only C).
Calling Native -> Java
- Methods annotated with
@CalledByNativewill have stubs generated for them. - Just call the generated stubs defined in generated
.hfiles.
Java Objects and Garbage Collection
All pointers to Java objects must be registered with JNI in order to prevent garbage collection from invalidating them.
For Strings & Arrays - it's common practice to use the //base/android/jni_* helpers to convert them to std::vectors and std::strings as soon as possible.
For other objects - use smart pointers to store them:
ScopedJavaLocalRef<>- When lifetime is the current function's scope.ScopedJavaGlobalRef<>- When lifetime is longer than the current function's scope.JavaObjectWeakGlobalRef<>- Weak reference (do not prevent garbage collection).JavaParamRef<>- Use to accept any of the above as a parameter to a function without creating a redundant registration.
Additional Guidelines / Advice
Minimize the surface API between the two sides. Rather than calling multiple functions across boundaries, call only one (and then on the other side, call as many little functions as required).
If a Java object “owns” a native one, store the pointer via "long mNativeClassName". Ensure to eventually call a native method to delete the object. For example, have a close() that deletes the native object.
The best way to pass “compound” types across in either direction is to create an inner class with PODs and a factory function. If possible, make mark all the fields as “final”.
Build Rules
generate_jni- Generates a header file with stubs for given.javafilesgenerate_jar_jni- Generates a header file with stubs for a given.jarfilegenerate_jni_registration- Generates a header file with functions to register native-side JNI methods (required only when using crazy linker).
Refer to //build/config/android/rules.gni for more about the GN templates.
Changing jni_generator
- Python unit tests live in
jni_generator_tests.py - A working demo app exists as
//base/android/jni_generator:sample_jni_apk
[Chromium文档转载,第007章]JNI on Chromium for Android的更多相关文章
- [Chromium文档转载,第003章]Proposal: Mojo Synchronous Methods
Proposal: Mojo Synchronous Methods yzshen@chromium.org 02/02/2016 Overview Currently there are quite ...
- [Chromium文档转载,第002章]Mojo C++ Bindings API
Mojo C++ Bindings API This document is a subset of the Mojo documentation. Contents Overview Getting ...
- [Chromium文档转载,第001章] Mojo Migration Guide
For Developers > Design Documents > Mojo > Mojo Migration Guide 目录 1 Summary 2 H ...
- [Chromium文档转载,第006章]Chrome IPC To Mojo IPC Cheat Sheet
For Developers > Design Documents > Mojo > Chrome IPC To Mojo IPC Cheat Sheet 目录 1 O ...
- [Chromium文档转载,第005章]Calling Mojo from Blink
For Developers > Design Documents > Mojo > Calling Mojo from Blink Variants Let's as ...
- [Chromium文档转载,第004章]Mojo Synchronous Calls
For Developers > Design Documents > Mojo > Synchronous Calls Think carefully before ...
- 用R创建Word和PowerPoint文档--转载
https://www.jianshu.com/p/7df62865c3ed Rapp --简书 Microsoft的Office软件在办公软件领域占有绝对的主导地位,几乎每个职场人士都必须掌握Wor ...
- java实现支付宝接口--文档..转载
//实现java支付宝很简单,只要从支付宝官方下载 http://help.alipay.com/support/index_sh.htm下载程序,配置一下参数就OK了: 1.先到http:/ ...
- iOS开发主要参考文档(转载)
Objective-C,语言的系统详细资料.这是做iOS开发的前题与基础.https://developer.apple.com/library/ios/#documentation/Cocoa/Co ...
随机推荐
- ubuntu鼠标和触摸板的禁用
ubuntu鼠标和触摸板的禁用 学习了:http://www.2cto.com/os/201308/239403.html 在终端下直接执行以下命令来打开或关闭触摸板. sudo modprobe - ...
- 10.29 工作笔记 ndk编译C++,提示找不到头文件(ndk-build error: string: No such file or directory)
ndk编译C++.提示找不到头文件(ndk-build error: string: No such file or directory) 被这个问题弄得愁眉苦脸啊.心想为啥一个string都找不到呢 ...
- 用html语言写一个功课表
今天在网上看了一个关于html的教程,主要是讲表格,看完之后认为有必要上机试试.于是就写了以下的一段代码. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb ...
- 好记性不如烂笔头86-spring3学习(7)-ApplicationContext中bean的生命周期
假设使用ApplicationContext来生成.管理Bean, 一个Bean从建立到销毁,会历经几个运行阶段. 我个人理解一般的bean的生命周期主要包含:建立,初始化,使用阶段,销毁四个核心阶段 ...
- 10.Intellij IDEA svn的使用详解
转自:https://www.2cto.com/kf/201703/614858.html 首先提一句,IDEA对各种的版本控制工具的支持是非常好的,打开系统设置界面,就可以看到他有专门的一栏 Ver ...
- [NOIP2015模拟10.27] [JZOJ4270] 魔道研究 解题报告(动态开点+权值线段树上二分)
Description “我希望能使用更多的魔法.不对,是预定能使用啦.最终我要被大家称呼为大魔法使.为此我决定不惜一切努力.”——<The Grimoire of Marisa>雾雨魔理 ...
- 把asp:CheckBoxList 变成单选框
单选框代码 <asp:CheckBoxList runat="server" RepeatDirection="Horizontal" ID=" ...
- SSD-tensorflow-2 evaluation
测试就是用voc2007的test set来测试已经训练好的checkpoint的mAP,github上提供了三个已经训练好的model的checkpoint checkpoint 里面已有的300_ ...
- caffe(11) 图像数据转换成db文件
在深度学习的实际应用中,我们经常用到的原始数据是图片文件,如jpg,jpeg,png,tif等格式的,而且有可能图片的大小还不一致.而在caffe中经常使用的数据类型是lmdb或leveldb,因此就 ...
- JS获取当前时间(YYYY-MM-DD ),element显示默认当前时间,显示默认昨天,显示默认上个月
原文链接:点我 进来的随便看看,或许有帮助 vue+element-ui datepicker 设置默认日期用的框架是vue+element-ui ,以下是时间控件 <el-form-ite ...