Android 现有工程添加 C/C++ 支持

本贴最后更新于 1324 天前,其中的信息可能已经沧海桑田

添加 C/C++ 支持

原文链接

前面我们新建工程时选择支持 C/C++。如何给现有项目添加 C/C++ 支持呢?

添加步骤

Tutorial2020 工程为例。我们给它手动添加 NDK。
工程中有一个 app 模块。往这个模块中添加 NDK。

添加 cpp 目录

app/src/main 目录下,新建 cpp 目录,其与 java 同级。

cpp 目录中新建文件 fisher-lib.cpp。目前这个文件还是空的,后面再添加代码。

新建 native 方法

新建 CalUtil 类,里面定义 native 方法。

package com.rustfisher.tutorial2020.cal;

public class CalUtil {
    public native int getNumber();

    public native String getMsg();
}

添加 cmake 配置

cpp 目录中新建 CMakeLists.txt 文件。
使用 add_library 方法进行配置。库名叫做 fisher-lib

cmake_minimum_required(VERSION 3.4.1)
add_library( # Specifies the name of the library.
             fisher-lib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             fisher-lib.cpp )

此时 cmake 还没有起作用。从 as 中可以看出字体都还是灰色。我们还需要配置 gradle。

配置 gradle

仿照之前的新建工程,添加 gradle 配置 externalNativeBuild。指定 cmake 的路径和版本。

android {
    
    defaultConfig {
        // 要添加的部分
        externalNativeBuild {
            cmake {
                cppFlags ""
            }
        }
    }

    // 要添加的部分
    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
            version "3.10.2"
        }
    }
}

sync 后可以发现 CMakeLists.txt 的代码已经有颜色了。

实现 cpp

现在 gradle 和 cmake 已经配置完毕,我们来实现 cpp 代码。
CalUtil 中有 2 个 native 方法,方法签名前缀是 Java_com_rustfisher_tutorial2020_cal_CalUtil_
当我们输入 g 时,as 会智能提示出我们想要的方法名。十分便利。

#include <jni.h>
#include <string>

extern "C" JNIEXPORT jstring JNICALL
Java_com_rustfisher_tutorial2020_cal_CalUtil_getMsg(JNIEnv *env, jobject thiz) {
    std::string hello = "欢迎来到Tutorial";
    return env->NewStringUTF(hello.c_str());
}

extern "C" JNIEXPORT jint JNICALL
Java_com_rustfisher_tutorial2020_cal_CalUtil_getNumber(JNIEnv *env, jobject thiz) {
    return 2020;
}

这里遇到一个 as 的问题,编写好 cpp 代码后,会有红线提示代码错误。但是直接运行项目又是正常的。
重新打开一次这个工程,红线就不见了。点击左边的图标,可以跳转到对应的 Java 方法。

addndktoprojfisherlibcpp1.png

调用方法

调用这 2 个方法。

private CalUtil mCalUtil = new CalUtil();
    // ....
    mCalUtil.getMsg();
    mCalUtil.getNumber()

至此给现有项目添加 NDK 完毕。

小结

  • 添加 cpp 目录
  • cpp 目录中添加 cmake
  • 在 gradle 中配置 cmake
  • 新建 native 方法
  • 编写 cpp 实现方法

原文链接

  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    333 引用 • 323 回帖 • 70 关注
  • ndk
    5 引用 • 2 回帖
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    90 引用 • 383 回帖 • 1 关注
  • JNI
    6 引用 • 2 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...