Android Studio向项目添加C/C++原生代码教程

Android Studio向项目添加C/C++原生代码教程
一、创建支持C/C++原生代码的新项目教程
1.1、下载NDK和构建工具

要为应用编译和调试原生代码,需要安装以下组件:

Android原生开发工具包 (NDK)----这套工具集允许我们为Android使用C和C++代码,且其提供众多平台库让我们可以管理原生Activity和访问物理设备组件,例如传感器和触摸输入。

CMake----一款外部构建工具,可与Gradle搭配使用来构建原生库。如果只计划使用ndk-build,则不需要此组件。

LLDB----一种调试程序,Android Studio使用它来调试原生代码。

安装步骤如下:

菜单栏----Tools----SDK Manager
在这里插入图片描述SDK Tools----钩选CMake/LLDB/NDK三项----点击确定
在这里插入图片描述在这里插入图片描述文件比较大,大概需要一二十分钟(受网速影响),完成后点击“Finish”即可
在这里插入图片描述1.2、创建支持C/C++的新项目
菜单栏–File—new—New Project
在这里插入图片描述其他信息按自己的需要填,主要是钩选“Include C++ support”
在这里插入图片描述接下来的三步和正常的项目创建没什么区,按自己的需要钩选或填写即可。我这里演示使用,全直接使用默认配置。

在向导最后“Customize C++ Support”会有以下几项内容:

C++ Standard----使用下拉列表选择您希望使用哪种 C++ 标准。选择 Toolchain Default 会使用默认的 CMake 设置。

Exceptions Support----如果您希望启用对 C++ 异常处理的支持,请选中此复选框。如果启用此复选框,Android Studio 会将 -fexceptions 标志添加到模块级 build.gradle 文件的 cppFlags 中,Gradle 会将其传递到 CMake。

Runtime Type Information Support----如果您希望支持 RTTI,请选中此复选框。如果启用此复选框,Android Studio 会将 -frtti 标志添加到模块级 build.gradle 文件的 cppFlags 中,Gradle 会将其传递到 CMake。

我这里使用默认配置,直接点击“Finish”

1.3、确认程序可以成功调用C++函数

将项目切换到“Android”视图观察整个项目,可发现较没有“Include C++ support”的项目,多了cpp和External Build Files两个组

在设计中cpp组用于存放项目的所有原生源文件、标头和预构建库。对于当前项目,Android Studio只创建了一个名为native-lib.cpp的C++源文件(位于src/main/cpp/目录)其中只有一个简单的C++函数stringFromJNI(),该函数返回字符串“Hello from C++”。

External Build Files组用于存放CMake或ndk-build的构建脚本。与Gradle需要build.gradle文件来指示如何构建应用一样,CMake和ndk-build依照一个构建脚本来构建原生库。对于当前项目,Android Studio创建了一个CMake构建脚本CMakeLists.txt(位于模块的根目录),用于指示编译构建native-lib.cpp。
在这里插入图片描述
点击查看“native-lib.cpp”内容如下,只有一个返回“Hello from C++”的函数
在这里插入图片描述
查看生成的activity_main.xml,如容如下,和Android Studio正常默认生成的项目一样,只有一个显示“Hello World!”的文本框
在这里插入图片描述
查看MainActivity.java内容如下,首选使用了System.loadLibrary()加载了本地库,然后在onCreate()中将activity_main.xml中的文框的内容修改为原生函数stringFromJNI()返回的字符串(Hello from C++)
在这里插入图片描述
我们直接在模拟器上运行app,如果界面文本框显示的不是“Hello World!”而是“Hello from C++”那说明程序成功调用原生函数。

菜单栏----Run----Run ‘app’选择虚拟机运行

图中的”Nexus 5X API 28”是我之前创建的虚拟机,没有虚拟机点击左下方的“Create New Virtual Device”创建即可。
在这里插入图片描述
可以看到界面如下,确实显示的是“Hello from C++”,也就是说经过如此配置之后程序确实可以成功调用C++函数
在这里插入图片描述

1.4 创建新的原生源文件【可选】

如果是简单使用,那直接在上边的native-lib.cpp后边追加函数即可(不过要注意前边的extern “C” JNIEXPORT jstring JNICALL相当于jstring,用于指明函数的返回值类型,自己在添加新函数时不要忘了需要指明返回值类型这回事,以致函数名位置一直报“Cannot resolve type”错误),在实际使用中经常需要创建多个文件。下边介绍如何创建新的原生源文件。

1.4.1 创建新的原生源文件
在这里插入图片描述
切换到“Project”视图,定位到app–src-main–cpp,在其上右键New–C/C++ Source File
在这里插入图片描述
这里我创建一个native-test.cpp
在这里插入图片描述
然后将native-lib.cpp中的函数复制过来,修改一下函数名和返回的字符串
在这里插入图片描述
1.4.2 修改CMake构建脚本

构建脚本只能有一个,而且名字必须为CMakeLists.txt,我们在Project视图app根目录下找到CMakeLists.txt。

模仿书写add_library()指出要生成的lib名及对应的源文件
在这里插入图片描述
接下来修改MainActivity.java将默认生成的调用stringFromJNI()改为调用我们修改过的stringFromJNITest()
在这里插入图片描述
程序成功安装运行,显示字符串也确实为"native-test:Hello from C++",证明成功调用
在这里插入图片描述

二、向已有项目添加添加C/C++代码

首先要明确,“为已有项目添加添加C/C++代码”其实质就要将“创建支持C/C++原生代码的新项目”中IDE自动为做好的步骤手动去实现。

C/C++原生代码支持在Android Studio中就是以下四步:第一步,安装CMake/LLDB/NDK。第二步,在项目中创建原生源文件。第三步,创建和编写CMake构建脚本CMakeLists.txt。第四步,向Gradle注册构建请求。

手动实现时照葫芦画标即可。

2.1 安装CMake/LLDB/NDK

与前边1.1节一样,不再赘述。

2.2 在项目中创建原生源文件
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
写入一个测试函数(这个函数就是“创建支持C/C++原生代码的新项目”时默认生成的函数,借过来用即可。不过千万要注意函数名前的包名要改成自己当前的包名,不然在java中调用就报找不到函数了)
#include <jni.h>
#include

extern “C” JNIEXPORT jstring

JNICALL
Java_com_example_ls_test1_Main1Activity_stringFromJNI(
JNIEnv env,
jobject /
this */) {
std::string hello = “Hello from C++”;
return env->NewStringUTF(hello.c_str());
}
在这里插入图片描述

2.3 创建和编写CMake构建脚本CMakeLists.txt
在这里插入图片描述在这里插入图片描述
写入以下内容(这里“创建支持C/C++原生代码的新项目”时自动生成的内容,find_library和target_link_libraries还不很清楚什么用但全复制进去准没错)
cmake_minimum_required(VERSION 3.4.1)

add_library( # Sets the name of the library.
native-lib

         # Sets the library as a shared library.
         SHARED

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

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 )

target_link_libraries( # Specifies the target library.
native-lib

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

在这里插入图片描述

2.4 向Gradle注册构建请求

打开build.gradle向android/defaultConfig节区追加以下内容:

externalNativeBuild {
cmake {
cppFlags “”
}
}

向android节区追加以下内容:

externalNativeBuild {
cmake {
path “CMakeLists.txt”
}
}
在这里插入图片描述

2.5 确认程序可以成功调用C++函数

这个和1.3一样然证即可,我自己测试结果和1.3一样是可以成功调用的。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值