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

Unity Android build崩溃,出现JNI错误(应用程序错误):访问过时的本地引用0x200001 (大小为0的表中的索引为0)

Unity Android build崩溃,出现JNI错误(应用程序错误):访问过时的本地引用0x200001 (大小为0的表中的索引为0)。

这个错误通常是由于在Unity项目中使用了过时的本地引用导致的。本地引用是在Java和C/C++之间传递对象引用的一种机制。当使用本地引用时,需要手动管理它们的生命周期,包括创建、使用和释放。

解决这个问题的方法是检查代码中是否存在未正确释放的本地引用。可以通过以下步骤来解决:

  1. 检查代码中的JNI调用:查找所有涉及JNI调用的代码,确保在使用完本地引用后进行释放。可以使用DeleteLocalRef()函数来释放本地引用。
  2. 检查JNI函数中的本地引用:如果在JNI函数中创建了本地引用,确保在函数返回之前释放它们。可以使用DeleteLocalRef()函数来释放本地引用。
  3. 检查JNI函数参数和返回值:确保在JNI函数中正确处理参数和返回值的本地引用。如果JNI函数返回一个本地引用,需要在Java层使用DeleteLocalRef()函数释放它。
  4. 使用弱全局引用:如果需要在Java和C/C++之间保持长期引用,可以考虑使用弱全局引用。弱全局引用不会阻止垃圾回收器回收对象,但可以在需要时重新获取对象的强引用。可以使用NewWeakGlobalRef()函数创建弱全局引用,并使用DeleteWeakGlobalRef()函数释放它们。
  5. 更新Unity版本:如果以上方法都无法解决问题,可以尝试更新Unity版本。新版本的Unity可能已经修复了一些与JNI相关的问题。

总结:

JNI错误(应用程序错误):访问过时的本地引用通常是由于未正确释放本地引用导致的。通过检查代码中的JNI调用、JNI函数中的本地引用、JNI函数参数和返回值的本地引用,并使用弱全局引用来管理长期引用,可以解决这个问题。如果问题仍然存在,可以尝试更新Unity版本。

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

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

相关·内容

Android NDK开发入门

JNI 简介 JNI (Java Native Interface英文缩写),译为Java本地接口。是Java众多开发技术一门技术,意在利用本地代码,Java程序提供更高效、更灵活拓展。...比如native访问java.lang.String 对应JNI类型jstring时,不能像访问基本数据类型那样使用,因为它是一个Java引用类型,所以在本地代码只能通过类似GetStringUTFChars...5.2 对象数组 对象数组元素是一个类实例或其他数组引用,不能直接访问Java传递给JNI数组。...对于这类错误问题是非常不好排查,比如内存地址访问错误、使用野指针、内存泄露、堆栈溢出等native错误都会导致APP崩溃。 虽然这些NDK错误不好排查,但是我们在NDK错误发生后也不是毫无办法可言。...不然局部引用会越来越多,最终导致崩溃(在Android低版本上局部引用最大数量有限制,是512个,超过则会崩溃)。

1.6K50

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

应用程序中使用JNI可以获得对机器资源(内存,I / O等)强大且低级访问权限,因此您可以在没有Java语言提供强大安全机制下工作。...JNI灵活性和强大功能为编程实践带来了风险,这可能导致性能低下,错误甚至程序崩溃。   本文将介绍JNI使用者所犯10个最常见编码和设计错误。...因此,使用代码7版本实现将会更加高效。 使用许多本地引用而不通知JVM   JNI函数返回任何对象创建本地引用。...当本地调用JNI方法时,可能引发异常,这时候需要本地去检查异常,并采取适当操作。常见JNI编程错误是调用了JNI方法而不检查异常,并忽略异常继续执行。这可能导致严重错误崩溃。   ...本地可能不会在这些方法之间进行任何JNI调用,所以可能不会出现阻塞问题。但是如果不遵守这些限制,则可能会导致应用程序或整个JVM出现间歇性死锁。

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

    为了方便,JNI提供了与UTF-8一起使用方法。但这种UTF-8是修改过UTF-8编码方式。这种方式对于C代码是有用,因为它将\u0000编码0xc0 0x80而不是0x00。...扩展检查 JNI几乎没有错误检查,错误通常会导致崩溃Android提供了一种称为CheckJNI模式,在调用标准实现之前,将JavaVM和JNIEnv函数表指针切换到执行扩展系列检查函数表。...扩展检查包括: 数组:尝试分配负大小数组。 错误指针:将一个坏jarray/jclass/jobject/jstring传递给JNI调用,或者传递一个NULL指针到一个不可空参数JNI调用。...对于显式注册,输入方法签名时会出现较小错误。确保您传递到registration 调用内容与日志文件签名相匹配。记住'B'是字节,'Z'是布尔值。...有两种基本方法: 您可以将数据存储在byte[]。这样从托管代码访问非常快。但是,在本地方面您无法保证不复制数据就可访问数据。

    1.6K20

    JNI使用内存相关问题记录

    1、C/C++层创建对象,返回指针给Java层,Java层使用该指针作为后续操作参数,在windows 64位系统出现地址无法访问问题: 参考:https://www.jianshu.com/p...; 基础用法: ndk-stack -sym 带有符号so所在目录 -dump 崩溃日志: 比如  ~/Library/Android/sdk/ndk/android-ndk-r16b/ndk-stack.../article/details/109095211  如果是给服务器或者Java应用程序使用JNI库,调试Crash日志方法,包括常规手段:日志法、return或者注释代码; 如果能从Core-dump...补记:20210702 事出蹊跷必有因,在Linux平台运行正常代码,在Windows平台就会出现异常,原来是Windows平台calloc申请出来内存并不会自动清0,导致结构体中指针对象非法指针...,内存释放就出现了野指针操作,崩溃也就不奇怪了!

    36120

    Android NDK开发完全剖析

    脚本位于 $ANDROID_NDK/build/tools/目录: $ANDROID_NDK/build/tools/make_standalone_toolchain.py \ --arch...JNIEnv 对应是线程,一个线程对应一个JNIEnv对象,在JNI多线程操作,一定要注意切换到当前线程JNIEnv,因为JNIEnv用于线程本地存储,无法在线程之间共享JNIEnv, 那怎么获取当前线程...全局引用/局部引用: 传递给原生方法每个参数,以及 JNI 函数返回几乎每个对象都属于“局部引用”。这意味着,局部引用在当前线程的当前原生方法运行期间有效。...是因为在indirectRef没有找到当前jobject对应索引,导致报错了,为什么找不到这个索引,这个jobject还没有被定义GlobalObject,这就和上面的分析对应起来了,在赋值时候...通过上面的分析来看,只要在global ref做好线程安全保护即可。 cpp怎么保证线程安全:使用pthread_mux_lock实现互斥锁,保证同样代码块或者变量互斥访问,不会出现多线程问题。

    1.9K10

    JNI设计实践之路

    Java程序通过生成DLL调用非Java程序 同时我们也可以通过JNI,将Java虚拟机直接嵌入到本地应用程序,步骤很简单,只需要在C/C++程序JNI API函数媒介调用Java程序。...头文件也定义了常量如:JNI_FALSE=0JNI_TRUE=1;二和三说明了Java类型和C类型之间映射关系。...二   Java基本类型到本地类型映射 三 Java类到本地映射 JNI函数NewStringUTF()是从一个包含UTF格式编码字符char类型数组创建一个新jstring对象。...env指针是指向一个函数指针指针。因此在每个JNI函数访问前加前缀(*env)->,以确保间接引用函数指针。 C/C++和Java互传参数需要自己在编程过程仔细摸索与体味。...第二个参数会根据Java类本地方法定义不同而不同,如果是定义static方法,类型会是jclass,表示对特定Class对象引用,如果是非static方法,类型是jobject,表示当前对象引用

    84730

    Android性能优化(一)

    那 Native 崩溃一般都是因为在 Native 代码访问非法地址,也可能是地址对齐出现了问题,或者发生了程序主动 Abort,这些都会产生相应 Signal 信号,导致程序异常退出。...JNI。使用 JNI 时,如果不注意很容易出现引用失效、引用等一些崩溃。 应用信息 除了系统,其实我们应用更懂自己,可以留下很多相关信息。崩溃场景。...,若无法申请到足够内存,会抛出OutOfMemoryError错误 本地方法栈 虚拟机Native方法服务,对本地方法栈中使用语言、数据结构、使用方式没有强制规定,虚拟机可自有实现 占用内存区大小是不固定...唯一一个在java虚拟机不会OOM区域 对象存活判断 引用计数法 给对象添加引用计数器,每当一个地方引用时,计数器加1,引用失效时计数器减1;当引用计数器0时即为对象不可用 实现简单,效率高,但是无法解决相互引用问题...可被回收 可被称为GC Roots对象:虚拟机栈引用对象、方法区类静态属性引用对象、方法区中常量引用对象、本地方法栈引用对象 GC Root有以下几种: Class-由系统ClassLoader

    2.6K20

    面向 Unity 程序员 Android 快速上手教程

    √ 字符串定义文件,一般被放到values文件夹下,这个里面可以定义一些字符串在里面,方便程序做国际 化还有本地化用。当然有时候被放到里面的还有其他xml会引用字符串,一般常见是app名称。...这有时候不会影响到打包流程,打包过程也不会报错,但是打出APK包缺少资源或者代码,一跑就崩溃。...相反,是外面的runOnUiThread是值得大家注意,在Android编程,所有涉及到对UI操作必须要放在UI线程里面来做,否则会造成其他线程修改UI线程里面的数据然后崩溃。...编译过程,可能会出现一些错误,下面罗列几个常见错误,可以尝试解决: 合并Manifest文件出错,一般来说是在合并所有的AndroidManifest文件时候出错,常见有重复定义了activity...除了上述这些之外,在打包Android项目的过程还会出现这些那些错误,大家看到以后不要慌张,会报错总是好,而且一般错误你把错误信息贴在万能Google上,都能找到解决方案。

    3.1K00

    面向Unity程序员Android快速上手教程

    WeTest 导读 随着Unity、cocos2dx等优秀跨平台游戏引擎出现,开发者可以把自己从繁重Android、iOS原生台开发解放出来,把精力放在游戏创作。...后面的四个是Android工程文件。前面两个文件夹是我们引用第三方库,他们也会被打包到APK。...这有时候不会影响到打包流程,打包过程也不会报错,但是打出APK包缺少资源或者代码,一跑就崩溃。...编译过程,可能会出现一些错误,下面罗列几个常见错误,可以尝试解决: 1....除了上述这些之外,在打包Android项目的过程还会出现这些那些错误,大家看到以后不要慌张,会报错总是好,而且一般错误你把错误信息贴在万能Google上,都能找到解决方案。

    1.7K41

    记录Android studio JNI开发三种方式(推荐)

    这里需要注意JNI是JAVA语言自己特性,也就是说JNIAndroid没有关系。在Windows下面用JAVA做开发也经常会用到JNI,例如:读写系统注册等。...第三步: 在jin文件夹创建.c结尾c文件,编写c代码,在c语言中定义在Java代码创建本地方法(natice方法) ,要按照jni规范定义方法(Java_包名_类名_natice...,在c语言中定义在Java代码创建本地方法(natice方法), 要按照jni规范定义方法(Java_包名_类名_natice方法名,其中包名点用_代替) 第四步: 在模块build.gradle...} } 配置完成用静态代码块方式加载so库 Static{ System.laodLibrany(“hello”) } 可能出现错误 1, No implementation...允许使用过时ndk) 总结 以上所述是小编给大家介绍记录Android studio JNI开发三种方式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家

    1.2K10

    Android NDK 示例-返回字符串,数组,Java对象;兼容性问题

    : onCreate: 3 处理数组方法 1.不要直接操作输入数组; 2.注意释放本地引用,防止溢出。...;// 释放本地引用 env->SetShortArrayRegion(result,0,len,resPtr); // 存入数据 env->ReleaseShortArrayElements...(result, resPtr, 0); // 释放本地引用 return result;// 返回结果 } JNI层 unsigned char 与 jbyte 数组转换 本例说明是unsigned...数组例 输入一个数组后,获取数组然后直接改变数组元素,最后释放掉本地引用 JNIEXPORT void JNICALL Java_com_rustfisher_ndkalgo_NDKUtils_nativeModifyArray...不需要修改so库名字。 错误原因猜想:app主工程与模块mylib中有同名so文件,安装app时会优先使用app主工程so库。

    1.7K20

    Android FFMPEG 开发】音视频基础 和 FFMPEG 编译 ( 音视频基础 | MPEG-4 标准 | Android 开发环境 | FFMPEG 交叉编译 | 安卓项目导入配置 )

    , 可能会出现错误; ( 4 ) 设置关键帧依赖帧数量 : 可设置 一个数量 如 30 帧, 依赖于一个 关键帧, 如果其依赖关键帧丢失, 那么这 30 帧都出现错误; 2.参考帧 : 除了关键帧意外...视频 故障 问题分析 : 1.花屏 : GOF P 帧 或 I 帧 丢失, 会导致解码图像出现错误; 2.卡顿 : 为了 防止花屏产生, 如果发现 P 或 I 帧丢失, 那么 整个 GOF 内帧都不显示...二进制文件; 4.复制库 : ndk-build 会将生成二进制文件复制到对应目录进行使用; 5.已过时 : 这是上一个版本 构建工具, 需要配置 Android.mk 和 Application.mk..., 用户名可以自己输入, 输入 root 用户名 和 密码 即可以 root 用户登录用户界面; 5.出现错误 : 此时会出现 /root/.profile 相关错误提示; 6.解决错误 :...${log-lib} ) 3.Java 层 本地方法 定义 : /** * 本地方法需要在 'native-lib' 本地实现, * 这个本地库必须打包在本应用.

    3.8K20

    JNI开发,你需要知道一些建议

    它们本质上都是指向函数表指针指针(在C++版本,它们被定义类,该类包含一个指向函数表指针,以及一系列可以通过这个函数表间接地访问对应JNI函数成员函数)。...扩展检查 JNI错误检查很少。错误发生时通常会导致崩溃。...应该声明方法“静态(static)”因此名称不会占据设备上符号空间。...这就使得JNI_OnLoad成为一个查寻及缓存类引用很便利地方。 64位机问题 Android当前设计运行在32位平台上。理论上它也能够构建64位系统,但那不是现在目标。...我们可以使用依次检测全局弱引用,参数,局部,全局方式来代替。第一次匹配到你直接指针时,就表明你引用类型是当前正在检测类型。

    1.4K30

    Android_其他语言交互篇——Js、C#、C、C++

    android定义可供js调用方法 然后,设置webview参数(1、打开js开关;2、设置webviewClient的如下方法返回值true,否则loadUrl时候会打开系统浏览器而不是我们...未添加JNI支持项目内容 首先,在app或module上右键如图选项,新建JNI文件夹(在随后出现对话框点Finish即可,也可以new Directory然后起自己想要名字): ?...编辑app或modulebuild.gradle文件 点击sync,然后make project,这时候在java代码定义native方法上alt+enter就会提示自动实现方法了,这就说明JNI...Android调用JNIJNI文件调用.java文件方法,一般分为3部: 1、首先反射拿到我们需要调用类,注意包名 ....,可以理解java自定义类型。

    2.2K20

    深入 Android 系统 - Android JNI

    要想跨平台,必须在不同系统环境下重新编译本地语言部分。 程序不再是绝对安全本地代码不当使用可能导致整个程序崩溃。...引用JNI中有三种引用本地引用(LocalReference)、全局引用(GlobalReference)、弱全局引用(WeakGlobalReference)。...而在创建对象时,JNIEnv隐式地把这些Java对象加入到本地引用(LocalReference)中了。 本地函数执行完后再将其从移除。这样虚拟机会在下次垃圾回收时将其释放。...应用程序内部如果JNI部分发生了错误,通常情况下不会打印太多log。...因此,Android定义了一个名为debug.checkjni属性: 当值1时,系统JNI函数会对调用参数进行更多检查 同样会增加资源消耗,降低执行效率 默认为0 设置方式: setprop

    1.9K40

    手把手教你如何在Android下进行JNI开发(入门)

    在进行Android开发过程,我们必定会遇到视频图像处理、高强度密集运算、特殊算法等场景,这时我们就不得不需要去接触一些C/C++代码,进行JNI开发。...android.useDeprecatedNdk=true 5.编译C/C++代码生成so文件 cd 到jni(存放Android.mk目录)下,执行 ndk-build即可。...Java 可以通过 JNI 调用本地 C/C++ 代码,本地 C/C++ 代码也可以调用 java 代码。...如果启用此复选框,Android Studio 会将 -frtti 标志添加到模块级 build.gradle文件 cppFlags,Gradle 会将其传递到 CMake。...JNI不同java对象提供了不同引用类型,JNI引用类型如下: 在c里面,所有JNI引用类型其实都是jobject。

    3.9K10

    Android Studio2.2下NDK开发初试

    下创建jni目录,在这个目录里就放mk文件和c/c++头文件、源代码文件,我们以hello-jni.c文件例,说一下开发流程。...+= -DSTDC_HEADERS 下一步,需要在appbuild.gradle说明ndk-buildmk文件在哪里,在android范围内添加 externalNativeBuild {...,如: public static native String getHelloString(); 接着,Android Studio可以帮助我们构建hello-jni.c文件,在错误地方,alt+...,如下 (*env)->CallVoidMethod(env, instance, progressMethod, total); 还有,在JNIc代码需要注意,可以运行时会报如下错误 JNI...java对象后及时调用env->DeleteLocalRef方法手动释放本地引用  如果native method返回java对象就不需要手动release,因为java会自动回收 好了,NDK开发基础就讲到这里吧

    96950

    深入探索JNI:基础、最佳实践、性能优化与安全策略

    不当内存管理可能导致内存泄漏或程序崩溃。 在JNI,正确内存管理是至关重要。...如果管理不当,这可能导致应用程序挂起或崩溃。...正确做法是在本地代码检查潜在错误,并通过JNI接口抛出Java异常,让Java层能够捕获并处理。 例如,如果本地方法发现无法打开指定文件,它应该抛出一个IOException给Java层。...例如,如果需要在本地代码执行多步处理,尽量设计一个方法完成所有步骤,而不是每一步创建一个单独 JNI 方法。 假设你需要在本地代码对图像进行多种处理,如调整亮度、对比度和应用滤镜。...尽量在一次 JNI 调用传递所有必要数据,或者在本地代码缓存这些数据。 如果需要频繁访问或修改 Java 对象多个字段,考虑在一个 JNI 调用传递所有必要数据。

    28820
    领券