Android jni

type
Post
summary
快速新建/新增 C++ 代码到 Android 项目
status
Published
author
slug
android-jni
tags
Android
C++
updateAt
Jul 19, 2023 03:20 AM
thumbnail
date
Jul 18, 2023

配置项目

不论是已有的项目加入 jni 支持还是直接初始化一个支持 jni 特性的项目,ndk 主要有以下一些关键的配置:

gradle 的关键配置

  • project 的 gradle.properties 需要声明 android.useDeprecatedNdk=true
  • 需要在 local.properties 中声明 ndk toolchains 的位置
  • 引入的 Module 下需要在 build.gradle 中的 defaultConfig 中声明 ndk 的配置项:
ndk {
	moduleName 'ndkModuleName'
	abiFilter 'armeabi-v7a'
}

C++ 源码

  • 一般放置在工程的 java 文件的同级目录下
  • CMakeLists.txt 构建脚本
    • 一般放置在引入的 Module 下的 src 目录下
    • 编写内容:
      • project(projectName)
      • cmake_minimum_required(VERSION 3.4.1)
        • add_library(
          	HelloJNILib # 库的名称
          	SHARED # SHARED:动态库、STATIC:静态库
          	src/main/jni/HelloJNI.cpp # 源文件,可以是多个
          )
    • 需要在对应的 build.gradle 中配置 CMakeLists.txt 的路径
    • externalNativeBuild {
      	cmake {
      		path "CMakeLists.txt"
      	}
      }

静态引用 JNI 库:

System.loadLibrary("HelloJNILib")

JNI native 方法及调用

kotlin:
external fun magicNumberFromJNI(): String?
C++:
extern "C"
JNIEXPORT jstring JNICALL
Java_com_peelson_learnjourneydemo_MainActivity_magicNumberFromJNI(JNIEnv *env, jobject thiz) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

需要知道的

  • ndk-build 是一种比 CMake 更快的构建工具,但仅支持 Android 且不可混用。

参考