转载请以连接形式标明出处: 本文出自:103style的博客html
本文操做以 Android Studio 3.4.2 版本为例java
NDK开发文章汇总android
Android Studio
.Name
, Package name
, Save location
中的值;Android Studio将会为咱们生成一个模板工程,咱们能够直接运行,启动以后界面上会显示 Hello from C++。git
从 Android Studio
左侧打开 Project
窗格并选择 Android
视图,以下图: github
咱们只要关心上图红框标记出来的如下这些文件就好:bash
MainActivity
:应用视图界面,加载了一个名为native-lib
的库,定义了一个native
的方法stringFromJNI
,而后将stringFromJNI
返回的值设置到TextView
上。public class MainActivity extends AppCompatActivity {
static {
System.loadLibrary("native-lib");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
...
tv.setText(stringFromJNI());
}
public native String stringFromJNI();
}
复制代码
CMakeLists.txt
:CMake 构建脚本。# 设置CMake的最低版本
cmake_minimum_required(VERSION 3.4.1)
# 添加源文件或者库
add_library(
native-lib # 库的名字
SHARED # 库的类型
native-lib.cpp) # 库的源文件
# 引用NDK中的库log,命名为log-lib
find_library(
log-lib # 库路径对应的变量名
log) # NDK中的库名
# 关联库,确保 native-lib 中 能使用 log 库
target_link_libraries(
native-lib
${log-lib})
复制代码
native-lib.cpp
: 示例 C++ 源文件,位于src/main/cpp/
目录。#include <jni.h>
#include <string>
extern "C" JNIEXPORT jstring JNICALL
//MainActivity 中 stringFromJNI方法 对应的 c 方法名字
Java_com_lxk_myapplication_MainActivity_stringFromJNI(
JNIEnv *env,
jobject ) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
复制代码
build.gradle
:构建文件android {
...
defaultConfig {
...
externalNativeBuild {
cmake {
cppFlags ""
}
}
}
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt" //构建脚本的路径
version "3.10.2"//CMake的版本
}
}
}
复制代码
若是刚刚运行过项目的话,点击左侧Project
窗格并选择 Project
视图,会在 app/build/intermediates/cmake/debug/armeabi-v7a/
下生成一个 libnative-lib.so
文件。app
CMake 使用 lib库名称.so
的规范来为库文件命名,库名称即为咱们定义的 native-lib
。不过咱们在Java代码中加载时,仍是使用咱们定义的库名称 native-lib
。ide
static {
System.loadLibrary("native-lib");
}
复制代码
向现有 Android Studio 项目添加或导入原生代码,则须要按如下基本流程操做:函数
CMake
如何将原生源文件编译入库。若是导入和关联预编译库或平台库,您也须要此编译脚本。若是现有的原生库已有 CMakeLists.txt
编译脚本,或使用 ndk-build
并包含 Android.mk
编译脚本,则可跳过此步骤。Gradle
关联到原生库。Gradle
使用编译脚本将源代码导入您的 Android Studio 项目并将原生库(.so
文件)打包到 APK
中。cpp
)并点击 OK。若是您的原生源文件尚未 CMake
构建脚本,则您须要自行建立一个并包含适当的 CMake
命令。工具
必须将其命名为 CMakeLists.txt。
cmake_minimum_required(VERSION 3.4.1)
add_library( hello-ndk
SHARED
src/main/cpp/hello-ndk.cpp)
复制代码
add_library()
向您的 CMake
构建脚本添加源文件或库时,Android Studio 还会在您同步项目后在 Project 视图下显示关联的标头文件。不过,为了确保 CMake
能够在编译时定位您的标头文件,您须要将 include_directories()
命令添加到 CMake
构建脚本中并指定标头的路径:add_library(...)
include_directories(src/main/cpp/include/)
复制代码
API
和库。将 find_library()
命令添加到您的 CMake
构建脚本中以定位 NDK 库。以 Android 特定的日志支持库 为例,为了确保您的原生库能够在 log
库中调用函数,您须要使用 CMake
构建脚本中的 target_link_libraries()
命令关联库:add_library(...)
find_library( log-lib # 库路径的变量名
log ) # 对应的库名
#将预构建库关联到您本身的原生库
target_link_libraries( hello-ndk
${log-lib} )
复制代码
要将 Gradle
关联到您的原生库,您须要提供一个指向 CMake
或 ndk-build
脚本文件的路径。在您构建应用时,Gradle
会以依赖项的形式运行 CMake
或 ndk-build
,并将共享的库打包到您的 APK
中。
build.gradle
文件会自动添加如下代码。externalNativeBuild {
cmake {
path file('CMakeLists.txt')
}
}
复制代码
以下图,按 Ctrl + Alt + s 进入 Setting 界面,点击 Tools → External Tools → + 配置添加外部工具。参数以下:
Name :JavaH
Program:$JDKPath$/bin/javah
Parameters: -encoding UTF-8 -d ../cpp -jni $FileClass$
Working directory: $SourcepathEntry$\..\java
复制代码
在 MainActivity
添加以下代码:
public class MainActivity extends AppCompatActivity {
static {
System.loadLibrary("hello-ndk");
}
public native String helloNDK();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
//添加下面两行代码
TextView show = findViewById(R.id.tv_show);
show.setText(helloNDK());
....
}
...
}
复制代码
修改 content_main.xml
,给TextView
添加 android:id="@+id/tv_show"
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
...>
<TextView
android:id="@+id/tv_show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
.../>
</android.support.constraint.ConstraintLayout>
复制代码
以下图,右键点击MainActivity
,选择弹出框中的 External Tools 的 JavaH 。就会在cpp
目录下生成 com_example_myapplication_MainActivity.h
文件,你的文件名可能不同。
修改hello-ndk.cpp
为如下代码:
#include <jni.h>
//确认此处名字是否可你生成的头文件的名字同样
#include "com_example_myapplication_MainActivity.h"
//函数名要和头文件中的名字一致
JNIEXPORT jstring JNICALL Java_com_example_myapplication_MainActivity_helloNDK
(JNIEnv * env, jobject){
return env ->NewStringUTF("Hello NDK");
}
复制代码
点击顶部菜单栏 Build 中的 Rebuild Project,完了以后按 Shirt + F10
运行程序,而后界面上就会显示 Hello NDK 的字样。
若是以为不错的话,请帮忙点个赞呗。
以上
扫描下面的二维码,关注个人公众号 Android1024, 点关注,不迷路。