背景
我对 C 很有经验,对 Android 和 Java 还很陌生,但这是编程的环境问题。
我已经用 ANSI-C 开发了一个管理应用程序,可以移植到任何操作系统,只需在依赖于操作系统的代码中添加 UI 即可。它使用相当多的内存,特别是对于巨大的用户文件。我有一个正在运行的 Win32 程序,尝试使用 Android Studio 和 NDK 制作 Android 应用程序。
Android studio捆绑NDK安装工作正常
我已经安装并制作了带有捆绑NDK的Win7 Ultimate Android Studio 1.3,并在模拟器中编译和运行ActionbarStyled(非NDK)hello-jni(NDK)示例,流畅且良好。我还在模拟器中成功运行了 Hello-jni 示例,其中包含一堆额外的 c 文件(未调用,目前只是垃圾,在此步骤中编译没有错误)
然后我尝试将我的三星 TAB3 SM-T110 模板(需要一个 Win7 三星驱动程序 SAMSUNG_USB_Driver_for_Mobile_Phones.zip)连接到我的 Win7 并尝试。 ActionbarStyled 示例效果很好。 Hello-JNI 示例也是如此。
But
使用一堆额外的 c 文件运行 Hello-jni 示例,我收到以下错误消息:
启动本机调试会话时出错:java.lang.IllegalArgumentException:无法在设备 samsung-sm_t110-47900bc50c0c3100 上找到 com.example.hellojni 的进程
我尝试了解问题是什么?是不是内存不足,三星充满了正在运行的应用程序,模拟器显然不是。
是什么让三星部门叫停了申请?错误信息不是这样描述的吗?
支持处理此类问题的更多问题
我们正在谈论 Android studio 1.3 捆绑 NDK,早期设置(在文章中)有多少适用于这个新的未来 NDK 标准使用?
Memory?
运行纯 Hello-jni 示例,我有大约 6Mb 内存(其中使用了 5Mb),这对于我的需求来说相当差,我需要做些什么才能让我的应用程序分配更多内存吗?该错误消息是由于内存不足造成的吗?
Android 应用程序可以做多大?我们又回到了像 8 位 DOS 64Kb 段业务那样的世界吗?我过去就知道,但事实并非如此?如果需要知道如何处理它。这在 Android 上使用 NDK 用于位图的无限制堆内存的库 https://stackoverflow.com/questions/18041326/library-for-unrestricted-heap-memory-for-bitmaps-using-ndk-on-android问题读起来很有趣,但这里我们讨论的是 jni (C-) 代码而不是 java。
编译器优化?
我有一些非常巨大的 C 文件,因为它们是机器生成的,将 XML 文档库转换为 C 代码(编写了一个从 XSD 定义编写 C 代码的程序)。在一个应用程序中,我大多数时候只使用所有 C 函数的 5%,其余的都在 Windows 开发工作室/编译器中进行了优化。当然,我可以重新组织我的源代码来完成一些额外的工作,但我需要知道。 Android Studio NDK 支持的优化如何?
问题在于,在此测试中,除了与 hello-jni 示例中相同的常规函数外,没有调用任何额外的 C 函数。实际上,编译器在这两种情况下应该做出完全相同的结果(修改后的和原始的 hello-jni)。但显然事实并非如此。请多解释一下环境是如何运作的,以便我知道?
一般兴趣
我试图在 Android 开发人员中找到任何描述编译器行为、内存管理和环境等内容的地方(Java 处理这些完全不同的内容,但在 C 编程中需要注意)。我认为对于 NDK 的使用,为了对环境的一般理解,在 Android 开发者页面的某个地方而不是在这里获得一个好的答案会很有趣。这还包括编译器在不同情况下如何优化。还有如何进行环境设置。