关于Android SDK本机方法

时间:2018-09-01 14:35:31

标签: android java-native-interface native

Android SDK的StaticLayout.java(位于软件包android.text中)定义了许多本机方法,如下所示:

private static native long nNewBuilder();

...

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

然后,我开始搜索那些本机方法here,然后发现了这些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)之类的本机方法,可以通过在我的Java类中定义一个private static native int nSayHello();之类的方法来直接由我的Android应用程序调用?

1 个答案:

答案 0 :(得分:0)

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

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