Android studio准备
Android studio需要下载Android6.0版本(Android SDK Platform 23),最小支持Android6.0
NDK 下载
cmake下载安装
Android studio 代理配置
dl.google.com可能会被屏蔽,首先查下其IP地址。查到IP地址后修改etc/hosts文件。
Android 市场份额
Android 个版本市场份额
Android 支持6.0就可以了。
CMake
C/C++ 编译成so库,需要使用到CMake。
新建一个Empty的Android工程,我们看下如何从0配置NDK开发环境。
然后打开Terminal
进入JNILoader所在的目录,输入如下命令
javac JNILoader.java
注意不要忘了后缀.java
输入javac -h ./ JNILoader.java,会生成相应的文件,注意./前后都要有空格。
然后将生成的com_example_testndkempty_JNILoader.h文件移动到cpp文件夹中。
然后创建JNILoader.cpp文件,并输入相关内容,如下图
注意,该文件代码错误,第九行代码应该是 return env->NewStringUTF(labelString.c_str());我截图中忘了增加()
接下来我们使用CMake编译cpp文件夹下的文件。
在app文件夹下创建CMakeLists.txt文件,注意,名字一定不要写错
CMakeLists.txt文件内容
cmake_minimum_required(VERSION 2.9.0.2)
#Test221123 编译成动态库,编译的时候使用JNILoader.cpp文件
add_library(Test221123 SHARED src/main/cpp/JNILoader.cpp)
#需要使用到的系统库
find_library(log-lib log)
#连接到哪些库
target_link_libraries(Test221123 ${log-lib})
Test221123是在JNILoader类中起的名字,详见上文。
Gradle文件中的配置,有两个地方需要新增,这两个地方已经加了汉语注释
plugins {
id 'com.android.application'
}
android {
compileSdk 32
defaultConfig {
applicationId "com.example.testndkempty"
minSdk 21
targetSdk 32
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
//编译可增加些flags,但我们这里不增加任何东西
externalNativeBuild{
cmake{
cppFlags ""
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
externalNativeBuild{
//cmake 文件的路径
cmake{
path "CMakeLists.txt"
}
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.3.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}
运行项目,build会出现下面的文件夹。
我们也可以指定编译的ndk 种类。
gradle里增加如下代码
ndk{
abiFilters 'x86_64','armeabi-v7a'
}
这里的代码会有红线,原因就是我们在c代码中使用了c++,可以做如下修改
//
// Created by 王学岗 on 2022/11/23.
//
#include <string>
#include "com_example_testndkempty_JNILoader.h"
extern "C" jstring Java_com_example_testndkempty_JNILoader_getNativeString
(JNIEnv *env, jobject obj) {
std::string labelString = "Hello 音视频开发";
return env->NewStringUTF(labelString.c_str());
}
或者这样写,也可以消除红线
//
// Created by 王学岗 on 2022/11/23.
//
#include <string>
#include "com_example_testndkempty_JNILoader.h"
#ifdef __cplusplus
extern "C" {
#endif
jstring Java_com_example_testndkempty_JNILoader_getNativeString
(JNIEnv *env, jobject obj) {
std::string labelString = "Hello 音视频开发";
return env->NewStringUTF(labelString.c_str());
}
#ifdef __cplusplus
}
#endif