Chromium里面的JNI以及格式转化

发现有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&,这里的第二个参数obj是addTohomescreenManager在java端的实例

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)); 

你可能感兴趣的:(Chromium里面的JNI以及格式转化)