关于 Android 个 SDK 原生方法
About Android SDK native methods
AndroidSDK的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)
这样的本地方法,我的 Android 应用程序可以直接通过在我的 java class 喜欢 private static native int nSayHello();
?
不,因为 JNI 基于 class,而不仅仅是方法名称。所以 nComputeLineBreaks()
可以被 android.text.StaticLayout
调用,但不能被其他 classes 调用。
这不是框架独有的。这是标准的 JNI 行为。
AndroidSDK的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)
这样的本地方法,我的 Android 应用程序可以直接通过在我的 java class 喜欢 private static native int nSayHello();
?
不,因为 JNI 基于 class,而不仅仅是方法名称。所以 nComputeLineBreaks()
可以被 android.text.StaticLayout
调用,但不能被其他 classes 调用。
这不是框架独有的。这是标准的 JNI 行为。