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应用程序调用?
答案 0 :(得分:0)
否,因为JNI基于类,而不仅仅是方法名称。因此nComputeLineBreaks()
可以被android.text.StaticLayout
调用,而其他类则不能。
这不是框架独有的。这是标准的JNI行为。