NDK介绍:
Android NDK 是一组允许您将 C 或 C++(“原生代码”)嵌入到 Android 应用中的工具。
Java 原生接口 (JNI):
JNI 是 Java 和 C++ 组件用以互相沟通的接口。
1. 在Studio中下载ndk:
在studio中,setting -->Android SDK -->SDK Tools ,勾选CMake、LLDB、NDK三个工具进行下载。下载成功后如下图所示:
个人建议下载离线ndk,SDK Manager下载的可能存在问题。
2.环境变量中配置ndk路径:
打开环境变量,创建NDK_ROOT,输入ndk文件夹所在路径
,将该变量添加到Path中,具体如下图所示:
3. 存在的问题(若是没遇到,跳过该步骤):
运行创建好的ndk项目,studio 3.0报错 :
Error:No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android
打开通过SDK Manager下载的ndk目录,找到toolchains文件夹,如下图所示:
去下载ndk离线包,选择对应的平台,ndk下载地址。 下载完成后,将缺失的文件拷贝过去或者整个NDK文件夹进行替换。
Android Studio 创建一个支持c++的项目,如下如所示:
第一个是main/cpp文件夹,包含一个c++的source文件。
第二个是CMakeLists.txt,AndroidStudio用它编译c++文件代码
除此之外,项目的build.gradle中也新增了camke的配置。
此时,运行项目,textview会显示"Hello from C++"
,若只满足于此,还是太简单,连入门都达不到。
1. Java static加载so库和native定义的函数
在Activity中,通过static静态代码块加载so库,该库命名为test-lib
static {
//加载c++文件
System.loadLibrary("test-lib");
}
//native定义函数
public native String getContentFromJNI();
public void showContent(){
textView.setText(getContentFromJNI());
}
2. 编写C++代码:
在main/cpp文件夹下右键,创建一个C/C++ Source File,输入文件名test-lib。
先使用#include
命令,引入头文件,例如jni、string等头文件,在添加命名空间std。
编写代码如下所示:
#include
#include
using namespace std;
编写java层中native定义的函数,对应的c++层函数:
先定义返回值
//jstring是Java原生接口规定的数据类型,它是指向java字符串的指针
JNIEXPORT jstring
c++对应的函数名是 Java 函数名和函数名所在文件的路径
JNICALL
Java_com_xingen_myapplication_MainActivity_getContentFromJNI( JNIEnv* env,jobject){
}
JNIEnv* 是指向虚拟机的指针,jobject 是指向从 Java 端传递的隐式 this 对象的指针。
命名规则:
编写函数内的返回值的c++代码:
string content="android通过jni与c++交互的结果";
return env->NewStringUTF(content.c_str());
完整的test-lib.cpp文件代码如下:
// Created by $HeXinGen on 2018/11/20.
//
#include
#include
using namespace std;
extern "C"
//jstring是Java原生接口规定的数据类型,它是指向java字符串的指针
//
JNIEXPORT jstring
JNICALL
Java_com_xingen_myapplication_MainActivity_getContentFromJNI( JNIEnv* env,jobject){
string content="android通过jni与c++交互的结果";
return env->NewStringUTF(content.c_str());
};
3. 将编写的c++文件配置到CMakelist.txt中:
第一步:新建一个add_library,中添加c++ source文件名和文件路径
#添加可执行文件所需要的库
add_library( # Sets the name of the library.
test-lib
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
src/main/cpp/test-lib.cpp )
第二步:target_link_libraries中添加c++ source文件名,这里是test-lib
target_link_libraries( # Specifies the target library.
native-lib
test-lib
# Links the target library to the log library
# included in the NDK.
${log-lib} )
4.运行效果如下:
资源参考:
android NDK文档:https://developer.android.google.cn/ndk/guides/
Android Studio中CMakeList的写法: https://www.jianshu.com/p/39ca6c51bc20