NativeActivity开发示例-使用AndroidStud
2019-12-09 本文已影响0人
DD_Dog
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/
目录
好了,这样就可以运行了。快试试吧!