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

标签 java android c++ c memory

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

相关文章:

java - 插件开发,用户数据保存在哪里?

java - Sonar 引用插件小部件未在仪表板中显示

java - 在子类中创建复合主键 (JPA)

android - 本地 iOS-Android zeroconf ad-hoc 网络

c++ - 在指向 int 的指针上调用 delete

java - JPA Hibernate Postgres 精度不起作用

java - 如何在 android imageview 中显示 SVG 图像

android - 更改文本 Controller 上的所有颜色

C++套接字服务器架构

c++ - 异常不会中断指令流