如何在现有的 Android Studio 工程中添加 C++ 代码

这篇具有很好参考价值的文章主要介绍了如何在现有的 Android Studio 工程中添加 C++ 代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题的引入

创建了一个 Android Studio 工程,在实现了许多功能后,需要在当前的工程中调用一些 C++ 代码,在网上查了一些资料,发现,都是在创建 Android Studio 工程时,就加入 C++ 支持,我不想重新创建带 C++ 支持的 Android Studio 工程,因为有些工作需要在新工程中重复做,很麻烦,于是,就想直接在当前 Android Studio 工程添加 C++ 代码。

实现方法简述

我采用的这种方法:创建了一个 Android Studio 工程,选用 “Empty Activity”,再创建了一个 Android Studio 工程,选用 “Native C++” ,然后对比了两个工程的文件差异,从这些差异中,找到了方法。

具体步骤

下面详述添加方法。我的环境是:win10,Android Studio 版本如下:
android studio c++,Android,android studio,c++,android,java,c语言

假设已经有了一个 Android Studio 工程(我这里是 javatest2),在创建它时,并不是 “Native C++”,现在需要在其中加入 “C++” 代码。

1 创建 cpp 文件夹

在 app/src/main 文件夹下(如下图所示),创建 cpp 文件夹,当然也可以是其他名字,比如 cxx,这个可以随意。
android studio c++,Android,android studio,c++,android,java,c语言
创建好后如下图所示:
android studio c++,Android,android studio,c++,android,java,c语言

2 在 cpp 文件夹下创建其他文件

在 cpp 中创建 inc 和 src 文件夹,以及 CMakeLists.txt,inc 用于存放 C++ 头文件,src 用于存放 C++ 源文件,这两个文件夹也不是必须的,只是我喜欢这样分类存放,CMakeLists.txt 是必须的,它用于指示如何编译 C++ 源文件。创建好后,如下图所示:
android studio c++,Android,android studio,c++,android,java,c语言

3 创建 C++ 源文件

在 inc 文件夹中,放入你的 C++ 头文件(我这里是 CalMinMax.h),在 src 文件夹中,放入你的 C++ 源文件(我这里是 CalMinMax.cpp),在 cpp 文件夹中,创建一个源文件(我这里是 native-lib.cpp)。如下图所示:
android studio c++,Android,android studio,c++,android,java,c语言

4 编写源代码

CalMinMax.h 代码:

#ifndef JAVACPP_CALMINMAX_H
#define JAVACPP_CALMINMAX_H

#include <string>

std::string calMinMax(int a, int b);

#endif //JAVACPP_CALMINMAX_H

CalMinMax.cpp 代码:

#include "CalMinMax.h"

std::string calMinMax(int a, int b)
{
    if (a > b)
        return std::string("Max string");
    else
        return std::string("Min string");
}

native-lib.cpp 代码,这里面定义了一些 JNICALL,它会直接调用到 C++ 代码(在这里,它调用了 calMinMax),要根据你的实际情况修改。
Java_com_example_javatest2_MainActivity_stringFromJNI 中,com_example_javatest2 跟包名相同(“.” 用 “_” 代替了),MainActivity 是要调用的 java 文件,stringFromJNI 是真正的方法名,注意名字不能有错误,不然在运行时会出错。

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

#include "CalMinMax.h"

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_javatest2_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */,
        jint a,
        jint b) {
    std::string hello = calMinMax(a, b);
    return env->NewStringUTF(hello.c_str());
}

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_minimum_required(VERSION 3.10.2)

# Declares and names the project.

project("javacpp")

# 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.
        javacpp

        # Sets the library as a shared library.
        SHARED

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

        src/CalMinMax.cpp)

include_directories(inc/)

# 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.
        javacpp

        # Links the target library to the log library
        # included in the NDK.
        ${log-lib})

说明一下,上面的 CMakeLists.txt 代码 与 native-lib.cpp 代码,用了 Android Studio 工程(选择 “Native C++” 时)自动生成的代码,但是做了一点修改。

5 在 java 文件中调用 C++ 代码

我这里示例,在 MainActivity.java 中调用,如下图所示:
android studio c++,Android,android studio,c++,android,java,c语言

注意,在调用 System.loadLibrary 时,libname 要与 CMakeLists.txt 中的 name of the library 相同。下面的 “public native String stringFromJNI(int a, int b);” 就是在声明方法。

6 修改 gradle 文件

修改下面的 gradle 文件:
android studio c++,Android,android studio,c++,android,java,c语言
修改如下,共有两处:
android studio c++,Android,android studio,c++,android,java,c语言
android studio c++,Android,android studio,c++,android,java,c语言
注意,ndkVersion 与你自己 Android Studio 中安装的 ndk 保持一致。

7 运行测试

运行结果如下:
android studio c++,Android,android studio,c++,android,java,c语言

8 其他说明

上面只是一个示例,有些地方写得不够规范,更好的做法是,将要调用 C/C++ 函数的 native 方法,全部写到一个 java 类中,统一管理。比如,上面的示例中,可以新建一个 java 类 MyC_CppFunc,将 native 声明放到这个类中,如下所示:

// 这里放你的包名
package com.example.javatest2;

public class MyC_CppFunc {
    // Used to load the 'javacpp' library on application startup.
    static {
        System.loadLibrary("javacpp");
    }

	/**
     * A native method that is implemented by the 'javacpp' native library,
     * which is packaged with this application.
     */
    public native String stringFromJNI(int a, int b);
}

这时,native-lib.cpp 代码要做一些修改,主要是 JNICALL 的名字,因为直接调用 C/C++ 函数的 java 类发生了变化,所以,名字要改为:Java_com_example_javatest2_MyC_1CppFunc_stringFromJNI,这里有一个小细节,前面的名字中,是 MyC_1CppFunc 而不是 MyC_CppFunc,下划线后面多了一个 “1”,因为包名中的 “.” 用下划线代替了,而 java 类名中有一个 下划线,如果不做特殊处理,会解析出错,所以规定要在 下划线后面加上 “1”。

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

#include "CalMinMax.h"

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_javatest2_MyC_1CppFunc_stringFromJNI(
        JNIEnv* env,
        jobject /* this */,
        jint a,
        jint b) {
    std::string hello = calMinMax(a, b);
    return env->NewStringUTF(hello.c_str());
}

如果要在 MainActivity.java 中调用,可以这样做,先创建 MyC_CppFunc 类的对象,然后用它的对象调用:文章来源地址https://www.toymoban.com/news/detail-841463.html

MyC_CppFunc c_cppFunc = new MyC_CppFunc();
TextView tv = findViewById(R.id.tv_show);
tv.setText(c_cppFunc.stringFromJNI(6, 2));

到了这里,关于如何在现有的 Android Studio 工程中添加 C++ 代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Visual Studio 向工程中添加现有文件夹

    前言: 在创建C#类库(dll)工程后,需要把现有的C#文件添加进工程中 步骤1.将所有文件夹复制到工程中 步骤2. 点击这个图标,显示所有文件夹  工程目录下的所有文件夹都会被显示出来  选中需要添加的文件夹,右键-包含到项目  然后再次点取消显示所有文件夹即可

    2024年02月05日
    浏览(47)
  • 使用Android Studio配置已有工程

    Download Android Studio App Tools - Android Developers Android Studio provides app builders with an integrated development environment (IDE) optimized for Android apps. Download Android Studio today. https://developer.android.google.cn/studio/ 安装完成,其他配置详见: Android Studio安装和使用教程(全文图解)_android studio安装教程_朝歌

    2024年02月16日
    浏览(33)
  • Android Studio 的github 工程克隆

    上文介绍了Android Studio 里的\\\"Git 建立和简单操作。本文介绍从github 上的工程fork 和clone到本地,然后学习和改进。 本文参考 https://learntodroid.com/how-to-use-git-and-github-in-android-studio/ 克隆clone Github 仓库: 先 Fork 你选择的仓库到你的github 仓库。操作如下:  这一步不是必须的,但

    2024年02月10日
    浏览(23)
  • Android Studio开发之路(二)添加图片资源

    第一步:复制要添加的图片 第二步:右键点击项目的res-drawable目录,选择paste粘贴 选择drawable目录 问你是否确定要复制,点击ok即可 然后就可以看到在drawable目录下出现了复制的图片 然后在xml中添加代码就可以显示在界面上了

    2024年02月09日
    浏览(34)
  • Android Studio开发简易APP添加代办事项

    创建xml布局页

    2024年02月15日
    浏览(32)
  • android studio 添加并读取json配置文件

    第一步:在android  studio中添加json文件;   第二步:读取文件的函数

    2024年02月16日
    浏览(33)
  • 【Unity3D】Android 打包 ④ ( Android 工程打包 | Unity 中导出安卓工程 | Android Studio 打开 Unity 导出的 Android 工程 )

    Android 工程打包 就是将 Unity 项目导出为 Android Studio 项目 , 在 Unity 编辑器中选择 \\\" 菜单栏 | File | Build Settings… \\\" 选项 , 在弹出的 \\\" Build Settings \\\" 对话框中 , 勾选上 \\\" Export Project \\\" 选框 , 然后点击右下角的 \\\" Export \\\" 导出按钮 ; 选择一个导出目录 ; 等待 Android 工程导出 ; 最终导出的

    2023年04月19日
    浏览(32)
  • Android studio添加MP3音频文件(超详细教程)

    进入Android studio 在res下新建一个文件夹raw,右击res—— New ——Direclory 输入raw 再把MP3文件复制到raw就可以了。 这样就完成了。

    2024年02月11日
    浏览(37)
  • 2022 最新 Android studio添加阿里云Aliyun Maven仓库

    网上看了很多的文章,都是老文章,要不就是AS是老版本,我是个新手,也不懂AS老了有啥好的,所以下载AS的时候,默认就选了最新的,这也让我踩了很多的坑,因为新。。。 太新了,很多资料对不上,连文件都找不到,CV过去之后,一堆错误。。。 看的是真让我头疼,几天

    2024年02月12日
    浏览(38)
  • Android studio创建新的工程时没有语言选项

    用新的Android studio创建工程时有时候会遇到没有语言选项,默认创建的工程是kotlin语言。 这时我们可以创建别的工程比如Empty view Activity 可以看到这时候就有语言选项

    2024年02月11日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包