NativeActivity

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>

其中有几项是需要配置的:

接下来添加源文件main.c,放在main/cpp目录下,并在该目录下新建CMakeLists.txt,同时拷贝android_native_app_glue.h到该目录,详情如下:

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库
        )

好了,这样就可以运行了。快试试吧!

附上源码

上一篇下一篇

猜你喜欢

热点阅读