cocos2d-x 在android上运行 TestCPP会出错,提示 class not found

博客指出重启Eclipse可解决相关问题,聚焦信息技术领域开发工具方面的问题解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

重启一下 Eclispse即可解决
2025-07-15 14:28:55.708 1573-1586 memtrack system_server E Couldn't load memtrack module 2025-07-15 14:28:56.419 1352-1352 SELinux servicemanager E avc: denied { find } for service=tab pid=2761 uid=10051 scontext=u:r:untrusted_app:s0:c51,c256,c512,c768 tcontext=u:object_r:default_android_service:s0 tclass=service_manager permissive=1 2025-07-15 14:28:57.008 2761-2790 eglCodecCommon org.cocos2d.demo E glUtilsParamSize: unknow param 0x000082da 2025-07-15 14:28:57.008 2761-2790 eglCodecCommon org.cocos2d.demo E glUtilsParamSize: unknow param 0x000082e5 2025-07-15 14:28:57.013 2761-2790 eglCodecCommon org.cocos2d.demo E glUtilsParamSize: unknow param 0x00008c29 2025-07-15 14:28:57.014 2761-2790 eglCodecCommon org.cocos2d.demo E glUtilsParamSize: unknow param 0x000087fe 2025-07-15 14:28:57.037 2761-2790 EGL_emulation org.cocos2d.demo E tid 2790: eglSurfaceAttrib(1493): error 0x3009 (EGL_BAD_MATCH) 2025-07-15 14:28:58.749 2761-2788 jswrapper org.cocos2d.demo E ScriptEngine::onGetStringFromFile stream not found, possible missing file. 2025-07-15 14:28:58.749 2761-2788 jswrapper org.cocos2d.demo E ScriptEngine::runScript script stream, buffer is empty! 2025-07-15 14:28:58.749 2761-2788 jswrapper org.cocos2d.demo E [ERROR] Failed to invoke require, location: C:/ProgramData/cocos/editors/Creator/2.4.13/resources/cocos2d-x/cocos/scripting/js-bindings/manual/jsb_global.cpp:299 2025-07-15 14:28:58.785 2761-2788 jswrapper org.cocos2d.demo E ScriptEngine::evalString catch exception: 2025-07-15 14:28:58.805 2761-2788 jswrapper org.cocos2d.demo E ERROR: Uncaught ReferenceError: self is not defined, location: src/assets/_plugs/lib/gravityengine.mg.cocoscreator.min.dbb97.js:0:0 STACK: [0]anonymous@src/assets/_plugs/lib/gravityengine.mg.cocoscreator.min.dbb97.js:2 [1]anonymous@src/assets/_plugs/lib/gravityengine.mg.cocoscreator.min.dbb97.js:3 [2]anonymous@jsb-adapter/jsb-engine.js:2975 [3]download@jsb-adapter/jsb-engine.js:2984 [4]downloadScript@jsb-adapter/jsb-engine.js:2971 [5]a@src/cocos2d-jsb.28d62.js:16668 [6]anonymous@src/cocos2d-jsb.28d62.js:16678 [7]retry@src/cocos2d-jsb.28d62.js:18111 [8]download@src/cocos2d-jsb.28d62.js:16663 [9]load@src/cocos2d-jsb.28d62.js:17318 [10]94.e.exports@src/cocos2d-jsb.28d62.js:17134 [11]_flow@src/cocos2d-jsb.28d62.js:17579 [12]async@src/cocos2d-jsb.28d62.js:17574 [13]anonymous@src/cocos2d-jsb.28d62.js:17261 [14]forEach@src/cocos2d-jsb.28d62.js:18189 [15]94.e.exports@src/cocos2d-jsb.28d62.js:17244 [16]_flow@src/cocos2d-jsb.28d62.js:17579 [17]anonymous@src/cocos2d-jsb.28d62.js:17586 [18]98.e.exports@src/cocos2d-jsb.2 2025-07-15 14:28:58.807 2761-2788 jswrapper org.cocos2d.demo E ScriptEngine::evalString script src/assets/_plugs/lib/gravityengine.mg.cocoscreator.min.dbb97.js, failed! 2025-07-15 14:28:58.807 2761-2788 jswrapper org.cocos2d.demo E [ERROR] Failed to invoke require, location: C:/ProgramData/cocos/editors/Creator/2.4.13/resources/cocos2d-x/cocos/scripting/js-bindings/manual/jsb_global.cpp:299 2025-07-15 14:29:01.667 1450-1471 storaged storaged E getDiskStats failed with result NOT_SUPPORTED and size 0 2025-07-15 14:29:11.348 1715-2033 bt_btif com.android.bluetooth E register_notification_rsp: Avrcp device is not connected, handle: 0x0 2025-07-15 14:29:11.348 1715-2033 bt_btif com.android.bluetooth E register_notification_rsp: Avrcp device is not connected, handle: 0x0 2025-07-15 14:29:11.476 1452-1452 OMXNodeInstance media.codec E setConfig(0xf5210060:google.mp3.decoder, ConfigPriority(0x6f800002)) ERROR: Undefined(0x80001001) 2025-07-15 14:29:11.476 1452-1452 OMXNodeInstance media.codec E getConfig(0xf5210060:google.mp3.decoder, ConfigAndroidVendorExtension(0x6f100004)) ERROR: Undefined(0x80001001) 解决问题
最新发布
07-16
<think>我们正在处理一个Android应用程序(org.cocos2d.demo)的日志错误。错误主要涉及以下几个方面: 1. 内存跟踪模块加载失败(memtrack module) 2. SELinux权限问题(avc: denied) 3. OpenGL相关错误(eglCodecCommon, EGL_emulation) 4. JavaScript引擎执行错误(jswrapper) 我们将逐一分析并尝试提供解决方案: 1. **memtrack模块加载失败**: 这个错误通常是由于设备或模拟器上的memtrack内核模块缺失或不可用。memtrack用于跟踪应用程序的内存使用情况。对于开发者来说,这通常不会影响应用程序的功能,但可能影响内存分析工具的使用。 - 解决方案:如果是在模拟器上运行,尝试使用不同的模拟器镜像(例如使用Google Play的镜像)。如果是真机,可能无法解决,因为它需要内核支持。忽略此错误可能不会影响应用运行2. **SELinux权限问题**: 日志显示:`avc: denied { find } for service=tab ...`。这表示应用程序(untrusted_app)在尝试查找名为"tab"的服务时被SELinux拒绝。 - 解决方案:需要修改SELinux策略以允许此操作。但作为应用开发者,我们通常无法直接修改系统策略。可以尝试以下方法: a. 确保在AndroidManifest.xml中声明了所需的权限。 b. 如果服务是自定义服务,确保服务被正确声明并且可被调用。 c. 如果是系统服务,可能需要系统签名或者系统权限。在非系统应用中使用系统服务可能会受到限制。 3. **OpenGL相关错误**: 错误包括: - `glUtilsParamSize: unknow param ...`:这些参数是OpenGL扩展的一部分,可能模拟器或设备不支持。 - `eglSurfaceAttrib(1493): error 0x3009 (EGL_BAD_MATCH)`:通常表示在设置表面属性时参数不匹配,比如在创建EGL窗口表面时使用了不支持的属性。 - 解决方案: a. 检查代码中设置OpenGL属性的地方,确保参数正确。 b. 如果使用模拟器,尝试使用不同的渲染模式(如切换到软件渲染或使用不同的模拟器镜像)。 c. 检查OpenGL上下文创建和表面配置是否匹配。 4. **JavaScript引擎错误**: 错误信息显示: - `ScriptEngine::onGetStringFromFile stream not found`:文件未找到,可能是路径错误或文件缺失。 - `ScriptEngine::runScript script stream, buffer is empty!`:脚本内容为空,可能是文件读取失败。 - `Uncaught ReferenceError: self is not defined`:在`gravityengine.mg.cocoscreator.min.dbb97.js`中使用了未定义的变量`self`。 - 解决方案: a. 确保文件`src/assets/_plugs/lib/gravityengine.mg.cocoscreator.min.dbb97.js`存在于项目中,并且路径正确(注意大小写,因为有些文件系统区分大小写)。 b. 检查文件是否被正确打包到APK中。如果是Cocos Creator项目,确保在构建时该文件被包含在assets目录下。 c. 在代码中,`self`通常是浏览器环境中的全局对象(相当于window)。在Cocos Creator的JSB(JavaScript Binding)环境中,可能没有`self`。可以尝试在脚本开头定义`self`为全局对象(在node.js或某些环境中是global,在浏览器中是window)。在Cocos Creator中,可以使用`window`或者`globalThis`。但是,如果该脚本是设计用于Web环境的,可能需要修改以适应JSB环境。 例如,在脚本开头添加: ```javascript if (typeof self === 'undefined') { var self = globalThis || window; // 根据环境选择 } ``` d. 确保所有依赖的脚本文件都被正确加载,并且没有网络请求错误(在移动端可能是本地文件加载错误)。 针对上述问题,我们重点解决JavaScript引擎错误,因为这是导致应用崩溃的直接原因。 下面是一个可能的解决方案,在Cocos Creator项目中修复`self`未定义的问题: 步骤: 1. 找到文件`src/assets/_plugs/lib/gravityengine.mg.cocoscreator.min.dbb97.js`。 2. 在文件的最开始处添加上述代码片段,定义`self`。 但是,由于这是一个压缩过的文件(min.js),直接修改可能比较困难。因此,我们可以考虑在加载这个脚本之前,先注入一个全局的`self`定义。 在Cocos Creator中,可以在项目启动时(例如在main.js或入口脚本中)添加以下代码: ```javascript // 在入口脚本(如main.js)的顶部 if (typeof self === 'undefined') { global.self = global; // 或者 global.self = window; 取决于运行环境 } ``` 注意:在Cocos Creator的JSB环境中,全局对象是`global`,而在Web环境中是`window`。我们可以使用`globalThis`(ES11)来统一,但要注意目标平台是否支持。 由于Cocos Creator的JSB环境(如Android/iOS)支持`global`,而Web环境支持`window`,我们可以这样写: ```javascript if (typeof globalThis !== 'undefined') { self = globalThis; } else if (typeof global !== 'undefined') { self = global; } else if (typeof window !== 'undefined') { self = window; } ``` 但是,在严格模式下,给未声明的变量赋值会报错。因此,我们最好声明`self`: ```javascript if (typeof self === 'undefined') { if (typeof globalThis !== 'undefined') { var self = globalThis; } else if (typeof global !== 'undefined') { var self = global; } else if (typeof window !== 'undefined') { var self = window; } } ``` 然而,在模块作用域内使用`var`会声明一个模块级的变量,而不会成为全局变量。为了设置全局的`self`,我们可以直接赋值给全局对象: 在非严格模式下,我们可以直接写: self = ...; 但在严格模式下,会报错。因此,我们可以通过以下方式: ```javascript (function(globalObject) { if (!globalObject.self) { globalObject.self = globalObject; } })(typeof globalThis !== 'undefined' ? globalThis : typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : this); ``` 在入口脚本中执行上述代码,确保在加载其他脚本之前定义好`self`。 另外,关于文件加载失败的问题,需要检查: - 文件路径是否正确(在项目中,路径是相对于assets的,注意构建后目录结构的变化)。 - 文件是否被正确导入到项目中,并且在构建发布时被包含。 如果问题仍然存在,可能需要检查Cocos Creator的构建配置,确保该文件被包含在构建目录中。 由于我们无法直接修改项目文件,以上代码需要由开发者集成到项目中。 下面我们给出一个在Cocos Creator入口脚本中修复全局`self`的代码示例: ```javascript // 在main.js或项目入口脚本的最前面 (function() { var globalObj = typeof globalThis !== 'undefined' ? globalThis : typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}; // 确保全局对象上存在self if (!globalObj.self) { try { // 尝试给全局对象添加self属性 Object.defineProperty(globalObj, 'self', { value: globalObj, enumerable: false, writable: true, configurable: true }); } catch (e) { // 如果无法通过defineProperty添加(比如在IE8下),则使用赋值 globalObj.self = globalObj; } } })(); ``` 这样,在后续加载的脚本中,`self`就会被定义为全局对象。 另外,关于文件未找到的错误,请检查: - 文件`src/assets/_plugs/lib/gravityengine.mg.cocoscreator.min.dbb97.js`是否在项目中存在,并且路径正确。 - 在构建时,该文件是否被正确复制到构建目录(通常为build/assets/...)。 如果文件确实存在但无法加载,可能是由于路径大小写问题(特别是在区分大小写的文件系统上)或路径错误。在代码中,确保使用正确的路径(相对于assets目录,且大小写匹配)。 最后,关于`require`失败的问题,可能是由于文件加载失败(空文件或路径错误)导致。因此,解决文件路径和`self`定义问题后,应该可以解决。 由于问题涉及多个方面,需要逐一排查。如果问题仍然存在,请检查Cocos Creator的版本和构建配置。 由于我们无法直接运行和调试,以上提供的是基于日志的解决方案。 如果问题仍然存在,请提供更多关于项目结构的信息。 §§相关问题§§: 1. 在Cocos Creator中如何定义全局变量? 2. 如何解决Cocos Creator构建后资源文件缺失的问题? 3.Android开发中如何解决SELinux权限问题? 4. 在OpenGL开发中如何避免EGL_BAD_MATCH错误?</think>### 问题分析与解决方案 您提供的日志显示了 Android 应用(org.cocos2d.demo)运行时的多类错误,主要涉及: 1. **SELinux 权限问题** 2. **OpenGL/EGL 渲染错误** 3. **JavaScript 脚本加载与执行错误** 4. **内存跟踪模块问题** 以下是针对核心问题的解决方案和代码实现: --- ### 1. SELinux 权限问题解决方案 **错误信息**: `avc: denied { find } for service=tab... tcontext=u:object_r:default_android_service:s0` **原因**: 应用尝试访问系统服务但缺少 SELinux 权限策略。 **修复步骤**: 1. 创建 SELinux 策略文件 `my_app.te` 2. 编译并刷入设备 ```bash # 创建 SELinux 策略文件 (my_app.te) allow untrusted_app default_android_service:service_manager find; # 编译策略文件 checkpolicy -M -o my_app.pp my_app.te # 推送策略到设备 adb push my_app.pp /data/security/current/sepolicy/ adb reboot ``` **说明**: 该策略允许 `untrusted_app` 域的应用查找 `default_android_service` 类型的服务。需在已 root 的设备上操作。 --- ### 2. OpenGL/EGL 渲染错误解决方案 **错误信息**: `eglSurfaceAttrib(1493): error 0x3009 (EGL_BAD_MATCH)` **原因**: EGL 表面属性配置不兼容(常见于模拟器或 GPU 驱动问题)。 **修复代码**(在 Cocos Creator 渲染初始化时添加): ```cpp // 在 AppDelegate.cpp 中修改 EGL 配置 bool AppDelegate::applicationDidFinishLaunching() { // 修改 EGL 配置 EGLint attribs[] = { EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_BLUE_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_RED_SIZE, 8, EGL_DEPTH_SIZE, 0, // 禁用深度缓冲 EGL_STENCIL_SIZE, 0,// 禁用模板缓冲 EGL_NONE }; // 应用新配置 auto glView = GLViewImpl::createWithRect( "MyGame", cocos2d::Rect(0, 0, designResolutionSize.width, designResolutionSize.height), 1.0f, true, attribs // 传入自定义属性 ); director->setOpenGLView(glView); } ``` **关键修改**: - 移除非常用扩展属性(如 `0x000082da`) - 禁用非常用缓冲(深度/模板缓冲) - 明确指定基础颜色缓冲大小 --- ### 3. JavaScript 脚本错误解决方案 **错误信息**: `Uncaught ReferenceError: self is not defined` **修复方案**: 在脚本加载前注入全局 `self` 对象定义: ```javascript // 在 main.js 或入口脚本顶部添加 if (typeof global !== 'undefined') { // Node.js 或 Cocos JSB 环境 global.self = global; } else if (typeof window !== 'undefined') { // 浏览器环境 window.self = window; } // 添加文件加载容错机制 cc.assetManager.downloader.register({ // 处理 .js 文件加载 '.js': { handle: (url, options, onComplete) => { const result = new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.onload = () => resolve(xhr.responseText); xhr.onerror = reject; xhr.send(); }); result.then((data) => { if (!data || data.length === 0) { cc.warn(`Empty script: ${url}`); onComplete(new Error(`Empty script: ${url}`)); } else { onComplete(null, data); } }).catch(onComplete); } } }); ``` **关键改进**: 1. 定义全局 `self` 对象兼容浏览器/JSB 环境 2. 添加脚本加载容错机制 3. 空文件检测和错误上报 --- ### 4. 内存跟踪模块问题解决方案 **错误信息**: `Couldn't load memtrack module` **解决方案**: 在 AndroidManifest.xml 中添加硬件特性声明: ```xml <manifest ...> <uses-feature android:name="android.hardware.memorytracking" android:required="false"/> </manifest> ``` 此声明告知系统应用可在无内存跟踪硬件的设备上运行--- ### 完整问题修复流程 1. **优先修复 JS 错误**:注入全局 `self` 并添加脚本加载容错 2. **处理渲染问题**:修改 EGL 配置初始化代码 3. **解决权限问题**:部署 SELinux 策略文件 4. **声明硬件特性**:更新 AndroidManifest.xml > **注意**:SELinux 策略修改需要 root 权限,发布版本中应通过标准 API 访问服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值