首页 > 解决方案 > 关于 Android SDK 原生方法

问题描述

StaticLayout.javaAndroid SDK (在 package 中)文件中定义了很多原生方法android.text,如下所示:

private static native long nNewBuilder();

...

private static native int nComputeLineBreaks(long nativePtr, LineBreaks recycle,
        int[] recycleBreaks, float[] recycleWidths, int[] recycleFlags, int recycleLength);

然后我开始在这里搜索那些原生方法,我找到了那些 C++ 代码。以本机函数nComputeLineBreaks为例,/frameworks/base/core/jni/android_text_StaticLayout.cpp文件中有一个方法,例如:

static jint nComputeLineBreaks(JNIEnv* env, jclass, jlong nativePtr,
    // Inputs
    jcharArray javaText,
    jlong measuredTextPtr,
    jint length,
    jfloat firstWidth,
    jint firstWidthLineCount,
    jfloat restWidth,
    jintArray variableTabStops,
    jint defaultTabStop,
    jint indentsOffset,...) 

在我看来StaticLayout是依赖原生方法来完成一些繁重的任务,但是我不明白的是如何调用这个原生方法,这是否意味着,例如,如果我们在 Android 中定义了一个原生方法static jint sayHello(JNIEnv* env, jclass)我的 Android 应用程序可以通过在我的 java 类中定义一个方法来直接调用类似的框架,比如private static native int nSayHello();

标签: androidjava-native-interfacenative

解决方案


不,因为 JNI 基于类,而不仅仅是方法名。所以nComputeLineBreaks()可以被 调用android.text.StaticLayout,但不能被其他类调用。

这不是框架独有的。这是标准的 JNI 行为。


推荐阅读