关于Android SDK本机方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Android SDK本机方法相关的知识,希望对你有一定的参考价值。

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依靠本机方法来完成一些繁重的任务,但我不明白的是如何调用这些本机方法,这是否意味着,例如,如果我们有一个定义的本机方法像static jint sayHello(JNIEnv* env, jclass)这样的Android框架可以通过我的Android应用程序直接通过在我的java类中定义一个方法来调用,如private static native int nSayHello();

答案

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

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

以上是关于关于Android SDK本机方法的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向Android 进程注入工具开发 ( Visual Studio 开发 Android NDK 应用 | Visual Studio 中 SDK 和 NDK 安装位置 )(代码片段

用百度SDK在Android中获取本机的经纬度,结果总是返回0.0有没有人和我遇到一样的情况呀

我的Android进阶之旅关于Android平台获取文件的mime类型:为啥不传小写后缀名就获取不到mimeType?为啥android 4.4系统获取不到webp格式的mimeType呢?(代码片段

我的Android进阶之旅关于Android平台获取文件的mime类型:为啥不传小写后缀名就获取不到mimeType?为啥android 4.4系统获取不到webp格式的mimeType呢?(代码片段

将 Android Studio 和 SDK 更新到 22。现在,当尝试打开地图片段时,它会崩溃

Facebook Android SDK 仅在安装本机应用程序时工作