6

InputStream の読み取りを最適化したいので、RAM ページのサイズの byte[] バッファーを用意するとよいと考えました。

そのサイズを知る方法 (おそらく静的なもの) はありますか?

編集:

最後に、NDK と JNI を使用して成功しました。次のコードを C で記述しました。

#include <jni.h>
#include <unistd.h>

jlong Java_it_masmil_tests_TestsActivity_pageSize(JNIEnv* env, jobject javaThis) {
    return sysconf(_SC_PAGE_SIZE);
}

どこ:

  • it.masmil.tests はパッケージ名です
  • TestsActivity はクラス名です
  • pageSize はメソッド名です
  • env と javaThis は 2 つの必須パラメータです (場合によっては便利です)

そのファイルを NDK でコンパイルし、Java で次のコードを記述しました。

static {
    System.loadLibrary("clibrary");
}
private native long pageSize();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    long page = pageSize();
}

どこ:

  • clibrary は、NDK で作成したライブラリの名前です
  • pageSize は、C ファイルで宣言されているメソッドの名前です。
4

3 に答える 3

8

ページ サイズは Linux (カーネル) によって定義され、libc ( bionic )を呼び出して JNI 経由で取得できますsysconf(_SC_PAGESIZE)。Android は Linux とほとんどの ARM システムで実行されるため、4k ページ サイズを想定できます。

#include <unistd.h>
long sz = sysconf(_SC_PAGESIZE);

ただし、Java/C からこのような調整を簡単に行うことはできません。つまり、4k ブロックを要求したとしても、それが 4k でアライメントされることを保証する人は誰もいません。

Linux で 4k アラインされたブロックが必要な場合は、ページ サイズがアラインされていることが保証されているmmapを使用する必要があります。

于 2012-11-12T21:44:33.837 に答える
-1

JNIなどを追加することで本当にコストが回収されるとは信じがたいです。他の人と同じように 4096 または 8192 を使用してください。

于 2013-04-27T10:57:06.807 に答える