纯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 的示例)
38e43c86651b4a50a138b7f9248b0ba0.png

../../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。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐