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

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

目录
相关文章
若依框架 --- echarts 封装
若依框架 --- echarts 封装
768 0
|
5月前
|
人工智能 文字识别 自然语言处理
通义千问大模型驱动的法律智能体创新实践
律杏法务云是基于阿里云通义千问大模型构建的新一代法律人工智能平台,通过深度融合OCR、NLP、知识图谱技术与千亿参数级语言模型,在企业法务管理领域实现了从信息抽取、文书生成到风险预警的全流程智能化。本文将深入剖析其技术架构与五大核心模块,揭示大模型如何重塑现代法务工作范式。
1454 2
|
JavaScript
Threejs加载MMD
这篇文章详细介绍了如何在Three.js中加载和使用MMD(MikuMikuDance)模型,包括模型的导入、动画的播放以及与MMD相关的文件格式和操作流程。
921 2
Threejs加载MMD
|
搜索推荐 安全
如果您干不动跨境外贸独立站,可以来看看反向海淘代购模式
反向海淘代购模式是指海外消费者通过国内电商平台购买中国商品,再由代购方负责采购、质检、包装和国际运输。该模式商品丰富、价格竞争力强,能满足个性化需求,但也面临物流成本高、海关政策复杂等挑战。
1000 2
|
机器学习/深度学习 监控 算法
基于YOLOv8与ByteTrack的车辆检测追踪与流量计数系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标追踪、车辆检测追踪、过线计数、流量统计(1)
基于YOLOv8与ByteTrack的车辆检测追踪与流量计数系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标追踪、车辆检测追踪、过线计数、流量统计
|
机器学习/深度学习 人工智能 自动驾驶
实战案例分析:AI在特定行业的深度应用
【7月更文第20天】随着人工智能技术的飞速发展,其在各行各业的应用日益广泛且深入,不仅推动了产业创新,也极大地提升了服务效率与质量。本文将聚焦于金融、教育、和交通三大领域,通过具体案例与技术解析,展现AI如何在这三个行业中发挥着革命性的作用。
2408 0
|
机器学习/深度学习 监控 算法
支付宝商业化广告算法优化
支付宝商业化广告算法优化
972 0
|
自然语言处理 算法 物联网
如何训练一个大模型:LoRA篇
如何训练一个大模型:LoRA篇
3480 1
|
Kubernetes Linux Docker
如何在Docker和Kubernetes中使用代理IP?
如何在Docker和Kubernetes中使用代理IP?
867 1
|
Web App开发 tengine 应用服务中间件
Nginx 外的另一选择,轻量级开源 Web 服务器 Tengine 发布新版本
新版发布 近日,轻量级开源 Web 服务器 Tengine 发布了2.3.0版本,新增如下特性: ngx_http_proxy_connect_module [1] ,该模块让 Tengine 可以用于正向代理场景,支持对 CONNECT 方法请求的处理; HTTP2 Server粒度控制[...
22436 94