据我所知,Android 限制一个进程的 Java 堆大小。但是如果我们在 native 层下分配,我们可以分配任意多的内存(除非它大于可用内存)。
所以,我正在为此编写一个测试。
首先我创建了我可以分配的最大内存:
ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
int realAllowMemory = am.getMemoryClass();
其次,我分配了这个大小的 native 内存:
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 DETECTED ERROR IN APPLICATION: JNI NewByteArray called with pending exception 'java.lang.OutOfMemoryError' thrown in byte[] memory.hqt.com.heapsizetesting.jnitest.JNIActivity.getBigDataFromJni(int):-2
尽管根据我的测试,realAllowMemory
约为 256MB,但可用内存约为 1000MB。请在这一点上为我解释一下。
最佳答案
您正在 native 部分调用 Java 分配方法。它具有与 Java 代码相同的限制。为避免它使用 native 分配函数,例如 malloc()
。
关于java - 安卓 native : cannot allocate large memory under native layer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38977020/