android - 关于 Android SDK 原生方法
问题描述
StaticLayout.java
Android 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();
?
解决方案
不,因为 JNI 基于类,而不仅仅是方法名。所以nComputeLineBreaks()
可以被 调用android.text.StaticLayout
,但不能被其他类调用。
这不是框架独有的。这是标准的 JNI 行为。
推荐阅读
- python - 浮点值到时间(HH:MM)格式
- docker - runc 和 ctr 命令不显示 docker 图像和容器
- javascript - WebSocket 对象是否抽象出框架?
- c - const char **envp 应该做什么?
- javascript - 如何制作一个返回ajax请求响应的函数
- c# - 如何在拥有的实体中定义关系属性的名称
- javascript - 高度为 100% 时操作 webkit-keyframes 的高度
- c# - 将 PackageReferences 自动添加到 NuGet 包
- android - Facebook 中的用户好友权限
- java - 尝试从 github (windows) 编译 java 项目时出错