轉載請以連接形式標明出處: 本文出自: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, 點關注,不迷路。