纯C语言开发无java、无dex的安卓apk---2022笔记
纯C语言开发无java、无dex的安卓apkandroid native-activityandroid native_app_glue
纯C语言开发的安卓应用,分为 :
1). 无GUI的 command line tool,比如linux终端中的 clear、ls、mkdir、cp等指令
2). 带GUI的 activity 应用
光使用 Android NDK可以开发安卓应用吗?
答案是能,但只能开发出来这两样东西:
1). 无GUI的命令行程序,adb push 到安卓上是可以在 adb shell 中直接运行的
2). 带GUI的 .so 库文件,为便于描述,这种库暂称为 native_lib.so
一般情况是写个 native_lib.so 是让apk内的java代码调用。
但妙就妙在 SdkVersion - 9 以上的 dalvik/art 可以直接调用apk内的 native_lib.so,
也就是允许 apk 文件内没有任何java字节码、没有任何dex包。
而 native_lib 里面的C代码是可以创建界面的,
综上,使用 NDK 开发带界面的安卓应用,仅仅是缺个apk打包工具。
要让 dalvik/art 直接调用 native_lib.so,只需要在 AndroidManifest.xml 中指定:
<!-- This is the platform API where NativeActivity was introduced. -->
<uses-sdk android:minSdkVersion="9" /><!-- This .apk has no Java code itself, so set hasCode to false. -->
<application android:label="@string/app_name" android:hasCode="false">
纯C实现apk应用开发,苦在打包、签名apk这个环节,
目前没有一个全 native 的 apk builer,打包、签名工具全是 java 环境的,全都依赖JDK
自己的验证结果:
1). 无dex的apk确定可行,能正常安装
2). 自用的 oppo 手机,里面的 dalvik/art 确实可以直接加载这种apk 中 native_lib.so 并运行之
操作步骤:
1). 下载安装 NDK
2). 编译 NDK 中的 samples\native-activity\ 示例 (用C语言代码创建 activity 的示例)
../../ndk-build clean
../../ndk-build #就这两条指令即可,生成的.so 在 samples\native-activity\libs\ 里面
3). apk 打包,请参考gitee项目:build-apk-with-c: 纯C语言开发无java、无dex的安卓apk应用
4). 也可以把 apk 传到在用的手机上安装运行
可通过微信的“文件传输助手”
手机微信上长按收到的apk -> 点其它应用打开 -> 应用包安装程序
其它:
SdkVersion 虽然说选9即可,但设置得太低太旧的话安装apk的时候会提示说:
"此应用专为旧版Android打造,因此可能无法正常运行"
网上说设置为17以上就不会出现这个提示了。
Application.mk 中可修改生成哪些CPU的so
APP_ABI := arm64-v8a #all
NDK 中的 samples\native-activity\libs\ 示例 ,启动后会等待用户在屏幕上点一下,
然后不断变换背景色。
基于这样的开发环境,可以移植很多开源项目到安卓上,
比如,SDL、cairo等绘图库,也可以直接用C + 安卓EGL开发游戏。
2023.06.08 修正更新:
前文所说的 native_lib.so,并非由dalvik/art直接加载,而是 android sdk 中的 android.jar 里面有个java类,叫做NativeActivity,是由这个类加载的native_lib.so。这个类的完整路径为:android.app.NativeActivity。
更多推荐
所有评论(0)