Android的主要开发语言都是以Java为主,也有很多开发者使用其他语言,当然也有混合开发的,比如Java&C or Java&C++等。
现在看来,Android的开发语言相当多,像什么C# for Android,也有Qt for Android 使用Qt图形库,C++进行Android开发(PS:这玩意空包打出来都极其笨重)等等。不过,这无疑为Android的开发者添加了更多的选择,对于开发者来说也是件好事情。
实际上,Android中使用纯C来开发,其原理也并非纯C,只是将Java层封装好了,使用Jni来调用C | C++的library,不过呢,我们不需要去管那些Java层已经封装好的东西,只需要安心写C | C++代码就行了。
本文的重点是如何使用AndroidStudio和CMake工具实现一个Demo
一、基本原理
前面也说了,使用C进行APK开发,实际上也是调用了Java类,再通过JNI进行回调,那么我们最主要的用户交互界面Activity有很多的用户响应事件,这些事件就是被回调到了C代码中。在Java中Activity的入口是onCreate
方法,在C开发中入口函数是android_main
,在android_main
方法中注册各种事件的监听。
使用C语言需要自己使用图形库绘制,例如OpenGL
,相对而言是比较繁琐的。
二、AndrodiStudio配置过程
新建Module后,先配置AndroidManifest.xml
文件:
内容如下:
<application android:hasCode="false" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name="android.app.NativeActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <meta-data android:name="android.app.lib_name" android:value="native-activity" /> </activity> </application>
其中有几项是需要配置的:
android:hasCode="false"
表示该应用不包含Java代码android.app.NativeActivity
这个NativeActivity就是用Java封装的用来加载so库用的,固定写法android:name="android.app.lib_name"
指定要加载的so为的名称
接下来添加源文件main.c,放在main/cpp目录下,并在该目录下新建CMakeLists.txt
,同时拷贝android_native_app_glue.h
到该目录,详情如下:
- 新建cpp目录,拷贝源文件main.c到该目录,或者自己写,结尾有源码
- 新建文件,命令为CMakeLists.txt,内容如下:
project(Native-Activity) cmake_minimum_required(VERSION 3.4.1) #引入native_app_glue头文件 include_directories(D:/Android/Sdk/ndk-bundle/sources/android/native_app_glue) add_library(native-activity SHARED main.c) find_library(log-lib log) find_library(OPENGLES3_LIBRARY GLESv3 "OpenGL ES v3.0 library") find_library(EGL_LIBRARY EGL "EGL 1.4 library") find_library(android-lib android) #编译为静态库 add_library(app_glue STATIC D:/Android/Sdk/ndk-bundle/sources/android/native_app_glue/android_native_app_glue.c) target_link_libraries(native-activity app_glue #链接静态库native_app_glue ${log-lib} #链接log库 ${android-lib} #链接android库 ${OPENGLES3_LIBRARY} #链接OpenGLES库 ${EGL_LIBRARY} #链接EGL库 )
- 拷贝
android_native_app_glue.h
,该文件位于你的ndk下面的sources/android/native_app_glue/
目录
好了,这样就可以运行了。快试试吧!