发现有JNI的代码
http://www.chromium.org/developers/design-documents/android-jni
这里先以AddToHomescreenManager为例来讲讲JNI的基础吧。
AddToHomescreenManager在java层和native层都有定义,其中java层的代码在
src/chrome/android/java/src/org/chromium/chrome/browser/webapps/AddToHomescreenManager.java,而native层的代码在src/chrome/browser/android/webapps/add_to_homescreen_manager.cc
我们先从函数的定义讲起,在java那边的代码,定义和普通的java类相同,不同之处是两种函数,
Native调用java
第一种是native调用java的函数,在java端
/**
* Shows alert to prompt user for name of home screen shortcut.
*/
@CalledByNative
public void showDialog() {
AddToHomescreenDialog dialog = new AddToHomescreenDialog(this);
dialog.show(mActivity);
setObserver(dialog);
}
它们会在函数前面有一个@CalledByNative的注释,这个注解,表示它们会被native调用,而实际在native调用的时候
JNIEnv* env = base::android::AttachCurrentThread();
Java_AddToHomescreenManager_showDialog(env, java_ref_);
首先是 attach相应的线程,然后通过java_ClassName_method的方式调用,而且投两个参数,第一个是env的环境,第二个是java_ref_
java_ref_在类初始化的时候有reset
AddToHomescreenManager::AddToHomescreenManager(JNIEnv* env, jobject obj)
: is_webapk_compatible_(false) {
java_ref_.Reset(env, obj);
}
变量转化
字符串的例子
JNIEnv* env = base::android::AttachCurrentThread();
ScopedJavaLocalRef j_user_title =
base::android::ConvertUTF16ToJavaString(env, user_title);
Java_AddToHomescreenManager_onUserTitleAvailable(env,
java_ref_,
j_user_title);
java调用Native
native的方法,在native端定义
jlong InitializeAndStart(JNIEnv* env,
const JavaParamRef& obj,
const JavaParamRef& java_web_contents) {
content::WebContents* web_contents =
content::WebContents::FromJavaWebContents(java_web_contents);
AddToHomescreenManager* manager = new AddToHomescreenManager(env, obj);
manager->Start(web_contents);
return reinterpret_cast(manager);
}
我们可以看到,这个函数最终返回的指针类型是jlong,然后这个方法的头两个参数,也是跟java有关的,第一个是env,第二个是obj, 然后使用的时候实际就一个参数
mNativeAddToHomescreenManager = nativeInitializeAndStart(mTab.getWebContents());
在用之前需要在java类中定义
private native long nativeInitializeAndStart(WebContents webContents);
变量转化
string
在native端定义的时候,使用const JavaParamRef
void AddToHomescreenManager::AddShortcut(
JNIEnv* env,
const JavaParamRef& obj,
const JavaParamRef& j_user_title)
实际转化的时候,
base::string16 user_title =
base::android::ConvertJavaStringToUTF16(env, j_user_title);
base::android::ConvertJavaStringToUTF8(env, j_user_title);
Bitmap转化
BitMap
const JavaRef& bitmap
SkBitmap icon = gfx::CreateSkBitmapFromJavaBitmap(gfx::JavaBitmap(j_icon));