gpt4 book ai didi

java - 安卓 native : cannot allocate large memory under native layer

转载 作者:太空宇宙 更新时间:2023-11-04 01:22:24 26 4
gpt4 key购买 nike

据我所知,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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com