Androidは、1つのプロセスでJavaヒープサイズを制限しています。しかし、ネイティブレイヤーの下に割り当てると、(使用可能なメモリよりも大きい場合を除いて)必要な数だけ割り当てることができます。Android Native:ネイティブレイヤーの下に大きなメモリを割り当てることができません
だから、私はこれのためのテストを書いています。
まず、私は私が割り当てることのできる最大メモリを作成します。第二に、私はこのサイズでネイティブのメモリを割り当てる
ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
int realAllowMemory = am.getMemoryClass();
:
JNIEXPORT jbyteArray JNICALL
Java_memory_hqt_com_heapsizetesting_jnitest_JNIActivity_getBigDataFromJni(JNIEnv *env, jobject instance, jint memory) {
jbyteArray ret = (*env)->NewByteArray(env, memory);
return ret;
}
そして、私はすることによって、このメソッドを呼び出します。
public native byte[] getBigDataFromJni(int memory);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getBigDataFromJni(realAllowMemory * 1000 * 1000);
}
私がこれをするとき、私は例外を満たすでしょう:
JNIは、アプリケーションでエラーを検出:JNI NewByteArrayは 保留中の例外を除いていわゆる 'java.lang.OutOfMemoryErrorを' バイト[] memory.hqt.com.heapsizetesting.jnitest.JNIActivity.getBigDataFromJni(int型)でスロー: - 2
私がテストしたように、realAllowMemory
は約256MBですが、使用可能なメモリは約1000MBです。この時点で私に説明してください。
ありがとうございます:DあなたはJavaレイヤー上でオブジェクトを解放する方法を教えてください。ありがとうございます: "D –
あなたはjavaからどのように' free() 'を呼び出すのですか?' malloc() '呼び出しと同様にjniメソッドで' free() '呼び出しをラップすることができます –