SDK 与 API版本
Android build 中的 Java 版本 - https://developer.android.google.cn/build/jdks?hl=zh_cn
平台代号、版本、API 级别和 NDK 版本 - https://source.android.google.cn/docs/setup/about/build-numbers?hl=zh-cn#platform-code-names-versions-api-levels-and-ndk-releases
维基百科 Android - https://zh.wikipedia.org/wiki/Android
名称版本号API等级发行日期安全性更新状态Android 1.01.012008年9月23日不支持Android 1.11.122009年2月9日不支持Android Cupcake1.532009年4月27日不支持Android Donut1.642009年9月15日不支持Android Eclair2.0 – 2.15 – 72009年10月26日不支持Android Froyo2.2 – 2.2.382010年5月20日不支持Android Gingerbread2.3 – 2.3.79 – 102010年12月6日不支持Android Honeycomb3.0 – 3.2.611 – 132011年2月22日不支持Android Ice Cream Sandwich4.0 – 4.0.414 – 152011年10月18日不支持Android Jelly Bean4.1 – 4.3.116 – 182012年7月9日不支持Android KitKat4.4 – 4.4.419 – 202013年10月31日不支持Android Lollipop5.0 – 5.1.121 – 222014年11月12日不支持Android Marshmallow6.0 – 6.0.1232015年10月5日不支持Android Nougat7.0 – 7.1.224 – 252016年8月22日不支持Android Oreo8.0 – 8.126 – 272017年8月21日不支持Android Pie9282018年8月6日不支持Android 1010292019年9月3日不支持Android 1111302020年9月8日不支持Android 1212 – 12L31–322021年10月4日不支持Android 1313332022年8月15日支持Android 1414342023年10月4日支持Android 1515352024年10月15日支持Android 1616362025年6月10日支持
- 关于ABI ( Application Binary Interface) 说明
ABI 名称对应 CPUarm64-v8a表示第 8 代 64 位 ARM 处理器armeabi-v7a表示第 7 代及以上 32 位 ARM 处理器armeabi表示第 5 代和第 6 代 32 位 ARM 处理器x86-64表示 Intel 64 位处理器(主要平板和虚拟机使用)x86表示 Intel 32 位处理器(主要平板和虚拟机使用)Gradlex SDK 版本配置
https://developer.android.google.cn/ndk/guides/sdk-versions?hl=zh_cn
compileSdkVersion
需要强调的是 修改 compileSdkVersion 不会改变运行时的行为 。当你修改了 compileSdkVersion 的时候,可能会出现新的编译警告、编译错误,但新的 compileSdkVersion 不会被包含到 APK 中:它纯粹只是在编译的时候使用。(你真的应该修复这些警告,他们的出现一定是有原因的)
因此我们强烈推荐 总是使用最新的 SDK 进行编译 。
minSdkVersion
定义应用程序支持的最低API版本
targetSdkVersion
targetSdkVersion 是 Android 提供向前兼容的主要依据
一个targetSdkVersion的属性值表示创建的Android项目使用哪个API版本,一个API版本使用一个整型数字表示,API的全称是Application Programming Interface,即应用程序编程接口,API 19对应的编程接口和API 23定义的编程接口存在差别,因为使用整型数字表示targetSdkVersion的属性值,容易记忆和便于比较它们之间的大小,高版本API编程接口可以兼容低版本API编程接口,反之则不行。
一个 NDK 调用示例
参考 [[N_Cmake]]
CMakeLists.txt
- # For more information about using CMake with Android Studio, read the
- # documentation: https://d.android.com/studio/projects/add-native-code.html.
- # For more examples on how to use CMake, see https://github.com/android/ndk-samples.
- # Sets the minimum CMake version required for this project.
- cmake_minimum_required(VERSION 3.22.1)
- # Declares the project name. The project name can be accessed via ${ PROJECT_NAME},
- # Since this is the top level CMakeLists.txt, the project name is also accessible
- # with ${CMAKE_PROJECT_NAME} (both CMake variables are in-sync within the top level
- # build script scope).
- project("pathplaning")
- # 设置 C++ 标准和相关标志
- set(CMAKE_CXX_STANDARD 14)
- set(CMAKE_CXX_STANDARD_REQUIRED ON)
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++ -Wall -Wextra")
- #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
- # boost_1_74_0 和 rapidjson 都是包含头文件就能用
- set(BOOST_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/boost_1_74_0)
- set(RAPIDJSON_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/rapidjson)
- # 设置头文件目录
- include_directories(
- ${BOOST_ROOT}
- ${RAPIDJSON_ROOT}
- )
- # 生成 静态库、动态库或对象库
- add_library(${CMAKE_PROJECT_NAME} SHARED
- pathplan/canvas.cpp
- pathplan/dubins.cpp
- pathplan/line.cpp
- pathplan/point.cpp
- pathplan/polygon.cpp
- pathplan/MainWindow.cpp
- android_interface.cpp)
- # 链接库和依赖项
- target_link_libraries(${CMAKE_PROJECT_NAME}
- android
- log)
复制代码 主要在
- include_directories 设置头文件的目录
- add_library 这项目的目标; 生成静态库或动态库, 这里是 SHARED 动态库
- target_link_libraries 链接 android 和 log
android_interface.cpp
注意函数名是有规则的 Java_{包名}_{类名}_{函数名}- #include <jni.h>
- #include <string>
- #include "rapidjson/document.h"
- #include "rapidjson/stringbuffer.h"
- #include "rapidjson/writer.h"
- #include <boost/date_time/gregorian/gregorian.hpp>
- #include <boost/multiprecision/number.hpp>
- #include "pathplan/MainWindow.h"
- extern "C"
- JNIEXPORT jstring JNICALL
- Java_org_yang_web_action_PathAction_planning(JNIEnv *env, jobject thiz, jstring input) {
- const char* p_input_char = env->GetStringUTFChars(input, nullptr);
- rapidjson::Document doc;
- doc.Parse(p_input_char);
- if(doc.HasParseError()) {
- env->ReleaseStringUTFChars(input, p_input_char);
- return env->NewStringUTF("{"msg": "Parse Error"}");
- }
- // 如果 MW.path_obs 为空
- rapidjson::Document output;
- //空字符串
- std::string obs_path_area = doc["obs_path_area"].GetString();
- if(obs_path_area.empty() || obs_path_area.size() < 20) {
- //无障碍规划
- output = Single_Machine_Planner_Without_Obstacle_path_planner(doc);
- }else{
- output = Single_Machine_Planner_With_Obstacle_path_planner(doc);
- }
- auto inputString = std::string(p_input_char);
- // 序列化 Document 为字符串
- rapidjson::StringBuffer buffer;
- rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
- output.Accept(writer);
- std::string outputString = buffer.GetString();
- //
- env->ReleaseStringUTFChars(input, p_input_char);//释放
- std::string message = "planning: input = " + inputString + ", output = " + outputString;
- std::cout << message << std::endl;
- return env->NewStringUTF(outputString.c_str());//返回字符串
- }
复制代码 全局引用
关于 gJniHelperInstance = env->NewGlobalRef(thiz); 在 JNI 中,默认传递的参数是局部引用:
- 局部引用只在当前 JNI 函数调用期间有效
- 当 JNI 函数返回时,局部引用会自动失效
- 如果尝试在后续调用中使用局部引用,会导致崩溃或未定义行为
- package org.yang.njzj.web.action
- import android.content.Intent
- import org.yang.njzj.activity.QRCodeActivity
- import org.yang.njzj.utils.JacksonUtils
- import org.yang.njzj.web.WebActivity
- import org.yang.njzj.web.dto.InteractiveMessage
- import org.yang.njzj.web.inter.CoroutinesProcess
- import org.yang.njzj.web.js.WebInteractiveMediation
- import pub.devrel.easypermissions.EasyPermissions
- import pub.devrel.easypermissions.PermissionRequest
- import java.util.Map
- /**
- * @description
- */
- class PathAction(private val wim: WebInteractiveMediation): CoroutinesProcess<InteractiveMessage> {
- // 区域规划算法模块
- companion object {
- init {
- System.loadLibrary("pathplaning")
- }
- }
- external fun planning(paths: String): String
- }
复制代码 调用入口
- plugins {
- id("com.android.application")
- id("org.jetbrains.kotlin.android")
- id("com.google.devtools.ksp")
- }
- android {
- namespace = "org.yang.njzj"
- compileSdk = 35
- defaultConfig {
- applicationId = "org.yang.njzj"
- minSdk = 29
- targetSdk = 34
- versionCode = 1
- versionName = "1.3.7"
- testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
- vectorDrawables {
- useSupportLibrary = true
- }
- ndk {
- // ABI 过滤
- // abiFilters.addAll(listOf( "arm64-v8a","armeabi-v7a", "x86_64", "x86"))
- abiFilters.addAll(listOf( "arm64-v8a", "x86_64"))
- }
- externalNativeBuild {
- cmake {
- cppFlags += ""
- arguments += "-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON"
- }
- }
- }
- ....
- // NDK
- externalNativeBuild {
- cmake {
- path = file("src/main/cpp/CMakeLists.txt")
- version = "3.22.1"
- }
- }
- }
- dependencies {
-
- }
复制代码 关于 Android.mk
https://developer.android.com/ndk/guides/android_mk?hl=zh-cn
Android.mk 是 Android 构建系统中用于编译 本地代码(C/C++) 的配置文件。它基于 GNU Make 语法,主要用于定义如何编译 JNI 库(.so文件)、可执行文件或静态库(.a)。
Android.mk 文件位于项目 jni/ 目录的子目录中,用于向构建系统描述源文件和共享库。它实际上是一个微小的 GNU makefile 片段,构建系统会将其解析一次或多次。Android.mk 文件用于定义 Application.mk、构建系统和环境变量所未定义的项目级设置。它还可替换特定模块的项目级设置。
in short 类似 CMakeLists 的一个定义文件 管理编译本地代码库的, 新项目建议优先使用 CMake(CMakeLists.txt) 不学也罢
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |