NativeActivity开发示例-使用AndroidStudio和CMake

简介: 笔记

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/目录

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

目录
相关文章
|
7天前
|
测试技术
使用CLion创建Cmake项目,使用GoogleTest和GoogleMock对代码进行测试
使用CLion创建Cmake项目,使用GoogleTest和GoogleMock对代码进行测试
20 3
|
2月前
|
编译器 Linux 开发者
【cmake 交叉编译配置设置】CMAKE_TOOLCHAIN_FILE:跨平台编译的秘密武器
【cmake 交叉编译配置设置】CMAKE_TOOLCHAIN_FILE:跨平台编译的秘密武器
69 0
|
3月前
|
编译器
【cmake】 --- 一个完整的cmake工程示例
【cmake】 --- 一个完整的cmake工程示例
31 0
|
8月前
|
C++
Cmake生成指定vs版本的工程文件
本文简单总结了使用 cmake 生成 visual studio 工程文件的过程
|
9月前
|
C++
2022-9-28-CMAKE工程中Cmakelist文档编写的一些注意点
2022-9-28-CMAKE工程中Cmakelist文档编写的一些注意点
87 0
|
11月前
|
编译器 Linux C++
QT的cmake项目工程配置
QT的cmake项目工程配置
|
Android开发 C语言
Android Studio NDK 代码 Source Insight调试 (NDK 目前开发方案 | NDK 编译 | 导入 so 库 | 项目编码转换)(一)
Android Studio NDK 代码 Source Insight调试 (NDK 目前开发方案 | NDK 编译 | 导入 so 库 | 项目编码转换)(一)
316 0
Android Studio NDK 代码 Source Insight调试 (NDK 目前开发方案 | NDK 编译 | 导入 so 库 | 项目编码转换)(一)
|
C++
AndroidStudio中CMake多模块多目录编译
在学习过程接触到了CMake编译,它的好处就是可以跨平台。 使用AndroidStudio开发的工程中需要引入第三方库,加上自己的lib库,最后生成指定的SO库,这就涉及到了多模块编译。
440 0
|
Windows
CMake教程12:CMake是怎么找到Qt相关模块的
CMake教程12:CMake是怎么找到Qt相关模块的
470 0