首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JNI错误(应用程序错误):本地引用表溢出(max=512) Android

JNI错误(应用程序错误):本地引用表溢出(max=512)是指在Android开发中使用JNI(Java Native Interface)时出现的错误。JNI允许Java代码与本地代码(如C或C++)进行交互,但在使用JNI时,需要管理本地引用表。

本地引用表是JNI用于跟踪本地对象引用的数据结构,它有一个固定的大小限制。当JNI函数频繁地创建本地对象引用而没有及时释放时,本地引用表可能会溢出,导致JNI错误。

解决JNI错误(应用程序错误):本地引用表溢出(max=512)的方法有以下几种:

  1. 减少本地引用的创建:在JNI函数中,尽量减少创建本地对象引用的次数,避免频繁创建大量的本地引用。
  2. 及时释放本地引用:在JNI函数中,使用DeleteLocalRef()函数及时释放不再使用的本地引用,以避免本地引用表溢出。
  3. 使用全局引用:对于需要在多个JNI函数中使用的本地对象引用,可以使用NewGlobalRef()函数创建全局引用,全局引用不会计入本地引用表的大小限制。
  4. 使用弱全局引用:对于不需要持久引用的本地对象引用,可以使用NewWeakGlobalRef()函数创建弱全局引用,弱全局引用不会计入本地引用表的大小限制,并且在垃圾回收时会自动释放。
  5. 增加本地引用表的大小限制:可以通过调用JNI函数EnsureLocalCapacity()来增加本地引用表的大小限制,但这种方法并不推荐,因为增加本地引用表的大小限制可能会导致内存消耗过大。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android NDK开发入门

应用程序框架层 Android平台最常用的组件和服务都在这一层,是每个Android开发者必须熟悉和掌握的一层,是应用开发的基础。...最后需要将for里面生成的jintArray及时移除引用。创建的jintArray是一个JNI局部引用,如果局部引用太多的话,会造成JNI引用溢出。...对于这类错误问题是非常不好排查的,比如内存地址访问错误、使用野指针、内存泄露、堆栈溢出等native错误都会导致APP崩溃。 虽然这些NDK错误不好排查,但是我们在NDK错误发生后也不是毫无办法可言。...在使用JNI时,由于本地代码不能直接通过引用操作JVM内部的数据结构,要进行这些操作必须调用相应的JNI接口间接操作JVM内部的数据内容。...不然局部引用会越来越多,最终导致崩溃(在Android低版本上局部引用的最大数量有限制,是512个,超过则会崩溃)。

1.6K50

Android 进阶解密笔记-JNI 基础

摘抄自>一书 JNI 是什么 JNI是Java Native Interface的缩写, 译为本地接口,是Java与其他语言通信的桥梁。...、全局引用与弱引用比较 和Java引用类型一样,JNI也有引用类型,分别是,本地引用、全局引用与弱引用 局部引用 局部引用:通过NewLocalRef和各种JNI接口创建(FindClass、NewObject...:JNIEnv提供函数所返回的引用基本上都是本地引用 特点: 当native函数返回,它就会自动释放 只能在创建它的线程有效,不能够跨线程使用 局部引用是JVM负责的引用类型,受JVM管理 Android...中局部引用最大数量为512个,如果超过这个最大容量限制,就会造成局部引用溢出,程序崩溃,所以不需要用局部引用时候要调用DeleteLocalRef立即删除。...JNI规范指出,任何实现JNI规范的JVM,必须确保每个本地函数至少可以创建16个局部引用(可以理解为虚拟机默认支持创建16个局部引用)。 局部引用不能跨线程使用,只在创建它的线程有效。

51530

Android | 关于 OOM 的那些事

线程溢出 不同的手机允许的最大线程数量是不一样的,在有些手机上这个值被修改的非常低,就会比较容易出现线程溢出的问题 FD数量溢出 文件描述符溢出,当程序打开或者新建一个文件的时候,系统会返回一个索引值,...指向该进程打开文件的记录,例如当我们用输出流文件打开文件的时候,系统就会返回我们一个FD,FD是可能出现泄露的,例如输入输出流没有关闭的时候,详细可参考 Android FD泄露问题 虚拟内存不足 在新建线程的时候...如果太大就会影响到可创建栈的数量,如果是多线程应用,就会导致内存溢出本地方法栈 与 java 栈的效果基本类似,区别只不过是用来服务于 native 方法。...#单个应用程序最大内存限制,超过将被Kill, dalvik.vm.heapsize=256m #所有情况下(包括设置android:largeHeap="true"的情形)的最大堆内存值,超过直接...Env 和 创建线程 创建 JNI Env 失败 FD 溢出导致 JNIEnv 创建失败 E/art: ashmem_create_region failed for 'indirect ref table

91820

【玩转 Cloud Studio】Android 中关于 OOM 的那些事

#### 线程溢出 不同的手机允许的最大线程数量是不一样的,在有些手机上这个值被修改的非常低,就会比较容易出现线程溢出的问题 #### FD数量溢出 文件描述符溢出,当程序打开或者新建一个文件的时候,系统会返回一个索引值...,指向该进程打开文件的记录,例如当我们用输出流文件打开文件的时候,系统就会返回我们一个FD,FD是可能出现泄露的,例如输入输出流没有关闭的时候,[详细可参考 Android FD泄露问题](https...如果太大就会影响到可创建栈的数量,如果是多线程应用,就会导致内存溢出。 - 本地方法栈 与 java 栈的效果基本类似,区别只不过是用来服务于 native 方法。...=48m #单个应用程序最大内存限制,超过将被Kill, dalvik.vm.heapsize=256m #所有情况下(包括设置android:largeHeap="true"的情形)的最大堆内存值...; } stack_size += 1 * MB; if (kMemoryToolIsAvailable) { stack_size = std::max

85530

Android Studio2.2下NDK开发初试

首先,配置Android.mk文件,如下所示 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello-jni...,如: public static native String getHelloString(); 接着,Android Studio可以帮助我们构建hello-jni.c文件,在错误的地方,alt+...enter后,就会发现多了一个hello-jni.c文件,里面需要引用的文件和声明的函数头,as都帮我们做好了,我们只需要写好函数体就好,这功能真的非常贴心,我们开发只用关心业务逻辑即可。...的c代码中需要注意,可以运行时会报如下错误 JNI ERROR (app bug): local reference table overflow (max=512) 这是JNI对java对象引用的限制...java对象后及时调用env->DeleteLocalRef方法手动释放本地引用  如果native method返回java对象就不需要手动release,因为java会自动回收 好了,NDK开发的基础就讲到这里吧

94850

JNI实现源码分析【三 间接引用】正文0x01: IndirectRefTable0x02: 作用域0x03: jobject到Object的映射0x04: JNI在背后默默做的事

【三 间接引用JNI实现源码分析【四 函数调用】 JNI实现源码分析【五 结束语】 正文 在JNI实现源码分析【二 数据结构】的参数传递一节中,我们提到,JNI为了安全性的考虑使用了形如jobject...JNI API中的全局引用和局部引用,指的就是全局作用域的间接引用和线程作用域的间接引用。...这里顺便提一下,当超过这个最大时,就会报local reference table overflow (max=512)的错误。...那么,这里就有一个问题了,既然间接引用和间接引用有关,那在使用JNI的API时,获取到这些间接引用时,JNI将真实的对象保存在哪个表里面?...(max=512)。

1K20

「音视频直播技术」JNI编程常见问题

字符串函数返回jchar *或jbyte *,它们是C样式的指向原始数据的指针,而不是本地引用。它们被保证有效,直到调用Release,这意味着当native方法返回时它们不会自动释放。...扩展检查 JNI几乎没有错误检查,错误通常会导致崩溃。Android提供了一种称为CheckJNI的模式,在调用标准实现之前,将JavaVM和JNIEnv函数表指针切换到执行扩展系列检查的函数表。...References:使用DeleteGlobalRef/DeleteLocalRef时,用了错误引用。...在这种情况下,你能在下次应用程序启动时在logcat输出中看到下面的信息: D Late-enabling CheckJNI 您还可以在应用程序的manifest中设置android:debuggable...如果您的应用程序代码正在加载库,FindClass将使用正确的类加载器。 将类的实例传递到需要它的函数中,通过声明本地方法来接受Class参数,然后传递Foo.class。

1.5K20

你真的会用JNI吗?这些小技巧99%的人都不知道

性能陷阱   使用JNI的程序员面临的五大性能缺陷: 不缓存方法ID,字段ID和类 触发数组拷贝 返回而不是传递参数 在本地代码和Java代码之间选择了错误的边界 使用许多本地引用而不通知JVM 不缓存方法...数组越大,创建的本地引用就越多。   本地代码执行完成时,将自动释放这些本地引用JNI规范要求每个本机能够创建至少16个本地引用。...JNI代码使用错误   JNI的五大使用错误: 错用 JNIEnv 不检查异常 不检查返回值 错误地使用数组方法 错误地使用全局引用 错用JNIEnv   子线程执行本地代码,尝试通过JNIEnv调用JNI...当本地调用JNI方法时,可能引发异常,这时候需要本地去检查异常,并采取适当的操作。常见的JNI编程错误是调用了JNI方法而不检查异常,并忽略异常继续执行。这可能导致严重的错误和崩溃。   ...当从本地方法返回时,它不仅没有被释放,而且应用程序再也没有办法获取它的引用以便以后释放它,因此该对象将永远存在。

98120

OpenCV开发中的内存管理问题

概述 如果你是OpenCV框架做开发、特别是用OpenCV C++版本或者Java/Android版本JNI的调用的化,可能很多时候你遇到最棘手的问题就是程序运行会越来越慢,甚至死机了,原因很简单,有时候你有内存泄漏问题...最典型的就是Mat对象的release方法,调用release并不会重根本上保证立刻回收内存,它只是让对象的引用计数减一,只有当对象的引用计数为0的时候,才会回收内存。...滥用/重用变量导致内存泄漏 注意要避免下面三种错误代码写法 错误一: Mat m1; for (int i = 0; i < 100; i++) { m1 = Mat::zeros(...Size(512, 512), CV_8UC3); } imshow("input-m1", m1); m1.release(); 错误方式:在循环中创建无数Mat对象,结果只释放了一个,很多人的循环就是这么写的...,OpenCV框架对内存的管理已经很智能化了,基本上代码规范写,记得release就不会有这个方面的问题,但是还是小心为妙,特别是跨语言调用的时候比如Android/Java通过JNI调用OpenCV函数

6K20

Android Pie限制非 SDK 接口的调用

只要应用引用非 SDK 接口或尝试使用反射或JNI来获取其(包括Method、Class、Field)句柄,这些限制就适用。...如果您的应用尝试访问其中任何一个接口,系统就会抛出错误 有条件屏蔽 (greylist-max-x) 从 Android 9(API 级别 28)开始,当有应用以该 API 级别为TargetVersion...SDK (whitelist) 已在 Android 框架中正式记录、受支持并且可以自由使用的接口 简单描述则为以下情况 : black List : 不管在哪个平台上 , 都会抛出错误 greylist-max-x...: 当APP的TargetVersion与运行时Android版本相同时 , 则会抛出错误 greylist : 目前可以继续调用 , 其实系统是不建议这样使用 , 可能在未来的版本会加入到greylist-max-x...image.png 接口访问 当black-list中接口通过反射、JNI接口去获取相应的Method、Field的引用时 , 就会报错.

1.1K30

一文读懂《Effective Java》第54条:谨慎的使用本地方法

JNI 全称 Java Native Interface。...本地方法的用途 本地方法主要提供三种用途: 提供“访问特定平台的机制”能力,如访问注册(registry)和文件锁(file lock) 提供“访问遗留代码库”能力,进而访问遗留数据(legacy data...所以,使用了本地方法的应用程序也不可以避免受到内存毁坏导致的错误。...Java 是一门安全的语言(safe language),因为它对于缓冲区、数组越界、非法指针以及其他的内存破坏错误都自动免疫,而类似内存溢出或者指针异常等问题却始终困扰着C/C++这样的非安全语言。...其三,因为本地语言是平台相关,使用本地方法的应用程序也不再是“自由移植”的。 其四,使用了本地方法的应用程序使得代码调试变得困难,在进入和退出本地方法时,需要额外的固定开销。

17910

AndroidJNI【实战教程】1⃣️--java和c/c++的那些事

JNIAndroid和c/c++中起着重要的作用,就相当于桥梁。你知道抗日时候为啥要先炸桥梁就知道JNI在其中的重要性了。...装载JNI动态链接库 为了使JNI本地方法调用前吧c/c++代码所在动态库装载待进程的内存空间中,装载库文件调用的是System的LoadLibrary()方法。...在JNI_OnLoader函数中,最重要的一件事就是调用registerNativeMethods ()函数完成动态库中JNI函数的注册,所谓注册,就是通过一张把java类中定义的native方法和本地...5.如何使用JNI类型 在JNI中,提供了以下各种数据类型,可以分为原生类型和引用类型: 对于原生类型有:jchar, jbyte, jshort, jint, jlong, jfloat, jdouble...错误处理的变化 ART中JNI函数会抛出“异常”,而Dalivk中之时返回NULL。

88760

浅谈Android Studio3.6 更新功能

现在,在XML或设计工具的颜色选择器中,Android Studio会在您的应用程序中填充颜色资源,以便您快速选择和替换颜色资源值。 ?...View binding 在代码中引用视图时,View binding可提供编译时安全性。 现在,您可以使用自动生成的绑定类引用替换findViewById()。...Native 工具 以下更新支持Android Studio中的Native(C / C ++)开发 扩展的Kotlin支持,包括改进的错误检查和Kotlin JNI声明与其C / C ++实现之间的导航...JNI的总体改进,包括增强的自动完成和检查功能。...APK重新加载本地库 当在IDE外部更新包含本地库代码的APK时,您不再需要创建新项目。 Android Studio会检测APK中的更改,并为您提供重新导入APK的选项。

1.3K30
领券