【问题标题】:JNI functions in Android webkit sourceAndroid webkit 源码中的 JNI 函数
【发布时间】:2012-09-28 15:00:17
【问题描述】:

read thatJNI函数(原生C部分)非常复杂,必须包含java包名。

但是,在阅读 Android webkit 源码时。例如WebView.java中的nativeMoveGeneration函数

private native int      nativeMoveGeneration();

调用WebView.cpp中的JNI函数

static int nativeMoveGeneration(JNIEnv *env, jobject obj)
{
    WebView* view = GET_NATIVE_VIEW(env, obj);
    if (!view)
        return 0;
    return view->moveGeneration();
}

他的 JNI 函数不遵循命名规则。为什么会这样?

P/S:以上功能仅供演示。我正在阅读Android 4.0.3源码,所以可能和上面的github源码不同

更新 感谢@Alex Cohn 和JNI Tips,我知道我们可以使用 JNI_Onload 或使用复杂的名称。但是我们应该把 JNI_Onload 放在哪里呢?

【问题讨论】:

    标签: android webview webkit java-native-interface


    【解决方案1】:

    JNI 定义了特殊的函数,JNI_OnLoad。它在调用任何 JNI 方法之前调用,它可以使用指向任何 C 函数的指针填充本机方法表。见the official document

    【讨论】:

    • 我阅读了 Android NDK 包中的所有示例,但没有看到 JNI_OnLoad,这是任意的吗? C 和 C++ 源码有什么区别吗?
    • 你说得对,人们更喜欢 javah 工具提供的默认绑定。在极少数情况下使用 JNI_OnLoad 是合理的。主要是帮助执行全局对象的初始化。在加载时执行它,您通常不太担心多线程竞争条件或对用户操作的即时响应。关于在 JNI_OnLoad 中填充原生方法表,对于极长的表可能会有一些性能提升,而且 WebKit 确实有很多原生方法可以映射。
    • 不使用 JNI 发现的另一个很好的理由是,现在可以将方法声明为“静态”,这样名称就不会占用设备符号表中的空间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多