Java Android本机:无法在本机层下分配大内存
正如我所知,Android限制了一个进程的java堆大小。但若我们在本机层下进行分配,我们可以分配任意数量的内存(除非它大于可用内存) 所以,我正在为此写一个测试 首先,我创建了可以分配的最大内存:Java Android本机:无法在本机层下分配大内存,java,android,c++,c,memory,Java,Android,C++,C,Memory,正如我所知,Android限制了一个进程的java堆大小。但若我们在本机层下进行分配,我们可以分配任意数量的内存(除非它大于可用内存) 所以,我正在为此写一个测试 首先,我创建了可以分配的最大内存: ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE); int realAllowMemory = am.getMemoryClass(); 其次,我分配一个本机内存,大小如下: JNIEXPORT
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
虽然在我测试时,
reallallowmemory
大约是256MB,但可用内存大约是1000MB。请在这一点上为我解释。您在本机部分调用Java分配方法。它具有与java代码相同的限制。为了避免这种情况,请使用本机分配函数,例如malloc()
您正在本机部分中调用Java分配方法。它具有与java代码相同的限制。为了避免这种情况,请使用本机分配函数,例如malloc()
非常感谢:D您能告诉我如何在java层上释放对象吗?谢谢:“你的意思是,如何从java调用free()
?你可以用jni方法包装free()
调用,就像malloc()
call一样。非常感谢:你能告诉我如何在java层释放对象吗?谢谢:”你的意思是,如何从java调用free()
?您可以使用jni方法包装free()
调用,就像malloc()
调用一样