AndroidStudio 3.0配置NDK,及编写C++与Java交互案例

NDK介绍

Android NDK 是一组允许您将 C 或 C++(“原生代码”)嵌入到 Android 应用中的工具。

Java 原生接口 (JNI)

JNI 是 Java 和 C++ 组件用以互相沟通的接口。

android studio配置ndk

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 开发第一个NDK案例

Android Studio 创建一个支持c++的项目,如下如所示:

在这里插入图片描述
创建完成后,会发现比纯Java项目多了几样东西。

第一个是main/cpp文件夹,包含一个c++的source文件。

第二个是CMakeLists.txt,AndroidStudio用它编译c++文件代码

除此之外,项目的build.gradle中也新增了camke的配置。

此时,运行项目,textview会显示"Hello from C++",若只满足于此,还是太简单,连入门都达不到。

动手写一个C++文件,通过jni接口与Java交互案例

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 <string>
#include <jni.h>
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 对象的指针。

命名规则:

  • 在名称前面加上 Java_。
  • 描述与顶级源目录相关的文件路径。
  • 使用下划线代替正斜杠。
  • 删掉 .java 文件扩展名。
  • 在最后一个下划线后,附加函数名。

编写函数内的返回值的c++代码:

    string content="android通过jni与c++交互的结果";
    return  env->NewStringUTF(content.c_str());

完整的test-lib.cpp文件代码如下:

// Created by $HeXinGen on 2018/11/20.
//
#include <string>
#include <jni.h>
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.运行效果如下

在这里插入图片描述

资源参考

猜你喜欢

转载自blog.csdn.net/hexingen/article/details/84303116