Android APP JNI 编写
-
Android 的普通的 APP 编写好了之后。如果想调用 C++ 代码,步骤如下.
-
在官网,下载 NDK, 一般最新的就可以, 下载完毕之后配置,配置如下 File -> Project Structure 里面:
![](https://img2020.cnblogs.com/blog/991711/202005/991711-20200512094150200-1509732925.png) * 这个路径不能有空格,有空格会报错,下载在官网上有下载。
-
配置完毕之后,就可以添加 C++ 代码了。
-
在源代码的 app/src 目录添加 CMakeLists.txt 文件,内容如下:
# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html
# Sets the minimum version of CMake required to build the native library.
# 设置cmake 的最小版本 一般系统自动生成
cmake_minimum_required(VERSION 3.4.1)
# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.
add_library( # Sets the name of the library.
# 设置生成.so 的文件名
my_lib
# Sets the library as a shared library.
#设置库的类型 一种静态文件 STATIC .a 一种动态文件 SHARED .so
SHARED
# Provides a relative path to your source file(s).
# 需要编译的c/c++ 文件
src/main/cpp/main.cpp )
# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.
find_library( # Sets the name of the path variable.
log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
log )
# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.
target_link_libraries( # Specifies the target library.
# 指定链接的目标库
my_lib
# Links the target library to the log library
# included in the NDK.
${log-lib} )
-
在 app/src/build.gradle 里面添加如下内容:
android {
compileSdkVersion 29
buildToolsVersion "29.0.3"
defaultConfig {
applicationId "com.example.cmi_at154_test"
minSdkVersion 25
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags ""
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
path 'CMakeLists.txt'
}
}
}
-
在 app/src/main 里面添加 C++ 文件夹,如下:
-
main.cpp 内容如下:
#include "jni.h"
#include "android/log.h"
extern "C"
JNIEXPORT jint JNICALL
Java_com_example_cmi_1at154_1test_MainActivity_ReturnCOM1Result
(JNIEnv *env, jobject thiz) {
return 1;
}
extern "C"
JNIEXPORT jint JNICALL
Java_com_example_cmi_1at154_1test_MainActivity_ReturnCOM2Result
(JNIEnv *env, jobject thiz) {
return 0;
}
extern "C"
JNIEXPORT jint JNICALL
Java_com_example_cmi_1at154_1test_MainActivity_ReturnCOM3Result
(JNIEnv *env, jobject thiz) {
return 1;
}
extern "C"
JNIEXPORT jint JNICALL
Java_com_example_cmi_1at154_1test_MainActivity_ReturnCOM4Result
(JNIEnv *env, jobject thiz) {
return 0;
}
extern "C"
JNIEXPORT jint JNICALL
Java_com_example_cmi_1at154_1test_MainActivity_ReturnUSBResult
(JNIEnv *env, jobject thiz) {
return 1;
}
extern "C"
JNIEXPORT jint JNICALL
Java_com_example_cmi_1at154_1test_MainActivity_ReturnGPSResult
(JNIEnv *env, jobject thiz) {
return 1;
}
extern "C"
JNIEXPORT jint JNICALL
Java_com_example_cmi_1at154_1test_MainActivity_ReturnWIFIResult
(JNIEnv *env, jobject thiz) {
return 0;
}
extern "C"
JNIEXPORT jint JNICALL
Java_com_example_cmi_1at154_1test_MainActivity_Return4GResult
(JNIEnv *env, jobject thiz) {
return 0;
}
-
现在在 Java 文件里面就可以调用这些 C++ 代码.
static {
System.loadLibrary("my_lib");
}
public native int ReturnCOM1Result();
public native int ReturnCOM2Result();
public native int ReturnCOM3Result();
public native int ReturnCOM4Result();
public native int ReturnGPSResult();
public native int ReturnWIFIResult();
public native int ReturnUSBResult();
public native int Return4GResult();
Read The Fucking Source Code