【问题标题】:On Android 4.x devices (unrooted), can checkJNI be disabled from within an app?在 Android 4.x 设备(无根)上,可以从应用程序中禁用 checkJNI 吗?
【发布时间】:2014-01-11 23:44:13
【问题描述】:

我有一个复杂的 Andriod 应用程序(Java 和本机代码),最初是为 Android 2.x 系列设备构建的。我已经在 Android 4.3 版本的模拟器上完成了所有工作,但我不得不使用 adb shell stop / adb shell setprop dalvik.vm.checkjni false / adb shell start 技巧来关闭 checkJNI 错误检查。代码使用非全局指针,但运行良好,没有明显的错误或问题。

我已经配置了我的 Linux 机器,因此 adb 可以正确看到一个小的“Digital2”低成本 Android 平板电脑,我现在可以将 .apk 文件加载到设备上。但该设备运行的是 Android 4.1.1,内核版本 3.0.8,并且似乎将 checkjni 设置为 true。

我尝试了几种方法来禁用设备上的checkjni,但都没有成功,而且设备没有root。我可以使用adb shell 和adb push,但不能使用/data 目录。尝试su 或运行adb root 失败,因此推送local.prop 文件不起作用。

我已经使用最新(2013 年 12 月 27 日)开发环境(Android 4.3,android-ndk-r9c)构建了代码,应用程序在模拟器上运行良好,checkJNI 设置为 0。有什么办法可以告诉 4.x Android 设备 - 在应用程序代码中,并使用 NDK-r9c - 不要在 dalvik VM 上使用 checkJNI? (注:我试过adb shell setprop debug.checkjni 0,没有效果。)我可以成功安装和卸载应用程序,但是设备上的adb logcat显示它与“stale reference”错误。

我也将 AndroidManifest.xml 中的 minSdkVersion 和 targetSdkverion 设置为“=8”,但应用程序构建目录中的 project.properties 文件具有条目 target=android-19,因为这是由ant 构建工具。

我是否必须使用 Android-13(“冰淇淋三明治”之前的版本)重新构建所有内容,才能让我的应用按照构建时的方式运行?任何建议都非常感谢。我是 Android 开发的新手,它是多个 Sdk 和 Ndk 的暴风雪。

【问题讨论】:

    标签: android android-ndk adb dalvik


    【解决方案1】:

    不,您无法在应用运行后更改 CheckJNI 设置,也无法针对每个应用进行设置。

    但是...我不知道 CheckJNI 误报的任何情况。如果它标记了问题,则确实存在问题,如果您不修复它,即使现在看起来可以正常运行,您的应用也有可能在未来出现故障。

    如果您需要帮助来跟踪它,请发布一个问题,其中包含显示故障报告和故障点代码的 logcat 输出。您应该从本机中止获得完整的回溯,您可以从中获取行号(参见例如 this post 或 this post 以获取有关 addr2line 的更多信息)。

    【讨论】:

    • 感谢时尚。更正:要使用以前的 Android 版本运行构建,您需要运行“../android-sdk-linux/tools/android update project --path --target android-”其中 是您要为其构建的 Android 版本。此操作会在您的项目目录中创建一个新的 project.properites 文件,然后您可以运行 build.sh 或 ndk-build 来重建您的项目。我使用 Android-13 重建了我的项目(我相信它使用的是 Android 3.2)。这并没有解决我的“checkjni”问题。我将发布一个关于修复陈旧本地指针的新问题。 - 俄罗斯。
    • 只是一个后续。该应用程序无法禁用“checkjni”,但您可以使用 SDK“android”实用程序,将您的目标 API 从当前构建目标更改为较低的目标,例如 android-8。这也将允许您的应用程序在早期型号的设备上加载。指定“--target=android-8”作为“更新项目”的选项。设备 logcat 将报告“Turning on JNI app bug workarounds for SDK version 8”。应用程序因找不到库而崩溃后,dalvik 在 logcat 中报告“Late-enable CheckJNI”。因此,您可以通过降级 API 版本来避免 checkJNI,但也许您不想这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多