Android chromium 2
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
Android chromium 2的更多相关文章
- Android Chromium WebView学习启动篇
Android从4.4起提供基于Chromium实现的WebView.此前WebView基于WebKit实现.WebKit提供网页解析.布局和绘制以及JS执行等基础功能.Chromium在WebKit ...
- Android chromium 1
For Developers > Design Documents > Java Resources on Android Overview Chrome for Android ...
- 35 Top Open Source Companies
https://www.datamation.com/open-source/35-top-open-source-companies-1.html If you think of open sour ...
- DevTools 实现原理与性能分析实战
一.引言 从 2008 年 Google 释放出第一版的 Chrome 后,整个 Web 开发领域仿佛被注入了一股新鲜血液,渐渐打破了 IE 一家独大的时代.Chrome 和 Firefox 是 W3 ...
- Ubuntu下编译Chromium for Android
转自:http://blog.csdn.net/fsz521/article/details/18036835 下源码git clone https://chromium.googlesource.c ...
- 理解WebKit和Chromium: 调试Android系统上的Chromium
转载请注明原文地址:http://blog.csdn.net/milado_nju 1. Android上的调试技术 在Android系统上,开发人员能够使用两种不同的语言来开发应用程序,一种是Jav ...
- chromium for android v34 2dcanvas硬件渲染实现分析
这篇接着上一篇2dcanvas硬件绘制,分析保存绘制结果的texture被合成到on screen framebuffer上的过程. 1.webkit为canvas元素相应的render树节点Rend ...
- Chromium on Android: Android在系统Chromium为了实现主消息循环分析
总结:刚开始接触一个Chromium on Android时间.很好奇Chromium主消息循环是如何整合Android应用. 为Android计划,一旦启动,主线程将具有Java消息层循环处理系统事 ...
- 理解WebKit和Chromium: Android 4.4 上的Chromium WebView
转载请注明原文地址:http://blog.csdn.net/milado_nju ## 概述 相信读者已经注意到了,在最新的Android 4.4 Kitkat版本中,原本基于Android Web ...
随机推荐
- Laravel-HTTP-验证
Laravel-HTTP-验证 标签(空格分隔): php 第一种方式 **1 直接在controller里完成表单验证** **2 打印验证返回的错误信息 dd($errors)** 第二种方式 * ...
- GetExecutingAssembly() 和 GetCallingAssembly() 的区别
在TCX_1710项目代码的启动项目根目录路径下的Global.asax.cs配置文件中的MVCApplication类中的Application_Start()方法中,配置了项目启动时要加载的项目信 ...
- 《鸟哥的Linux私房菜》笔记——02. 关于Linux
Unix 历史 1969年以前:伟大的梦想--Bell, MIT 与 GE 的「Multics」系统 1969年:Ken Thompson 的小型 file server system 1973年:U ...
- Linux 安装软件的几种方式
目录 几种安装方式 源代码编译安装 借助软件包管理器安装 二进制格式安装 总结 参考 几种安装方式 源代码编译安装 源代码包的安装一般为下载软件源代码,然后编译安装.常见的 C 程序软件的安装步骤是 ...
- ZOJ 2883 Shopaholic【贪心】
解题思路:给出n件物品,每买三件,折扣为这三件里面最便宜的那一件即将n件物品的价值按降序排序,依次选择a[3],a[6],a[9]----a[3*k] Shopaholic Time Limit: 2 ...
- Python读取Matlab的.mat文件
参考网站: https://blog.csdn.net/rumswell/article/details/8545087 数据: R 22*22 double 部分截图如下: 使用sicpy.io即可 ...
- webkit Safari的样式库
1,webkit Box模型 CSS定义:-webkit-border-bottom-left-radius: radius; CSS定义:-webkit-border-top-left-radius ...
- VB学习笔记(一)VB操作字符串
在vb中 dim a# 定义a变量为双精度型变量~ #是类型符 % 整型 & 长整型 !单精度 $ 字符型 VB中strconv 的作用 StrConv("要转换的字符串" ...
- 关于wdsl
WSDL元素 WSDL元素基于XML语法描述了与服务进行交互的基本元素: Type(消息类型):数据类型定义的容器,它使用某种类型系统(如XSD). Message(消息):通信数据的抽象类型化定义, ...
- Html标记语言学习一2017年6月12日
今天主要学习了 frame的用法. <frameset> 可以将网页分成几个不同的部分 使用 cols 和 rows 两种标记.前者是列,后者是行 <frame/> 单标 ...