Android Stuido:在現(xiàn)有工程中添加C/C++代碼

Abstract

本文介紹如何在現(xiàn)有Android studio工程中添加C/C++代碼以及相關(guān)native方法抱婉,并編譯成.so庫科汗。開發(fā)環(huán)境Android Studio 3.x脐嫂,請確認(rèn)已正確安裝NDK晃酒,LLDB,CMake(Tools-SDK Manager-SDK Tools)隙咸。ps:如果是新建項(xiàng)目沐悦,new project時(shí)直接勾選Include c++ support即可。

Step1 添加C/C++代碼

project視圖下五督,定位到app/src/main藏否,右鍵main - New - Directory,命名為cpp充包,在cpp目錄下新建include目錄副签,并添加以下c/c++代碼(注意目錄結(jié)構(gòu))。如圖



c_test.h

#ifndef NDKDEMO_C_TEST_H
#define NDKDEMO_C_TEST_H
const char * cFunction();
#endif

c_test.c

#include "stdio.h"
const char * cFunction(){
    const char * str = "String from C !";
    return str;
}

cpp_test.h

#ifndef NDKDEMO_CPP_TEST_H
#define NDKDEMO_CPP_TEST_H
const char * cppFunction();
#endif

cpp_test.cpp

#include <iostream>
using namespace std;
const char * cppFunction(){
    const char * str = "String from C++ !";
    return str;
}

Step2 添加CMakeLists.txt文件

右鍵app/ - New - File误证,命名為CMakeLists.txt继薛,添加內(nèi)容如下(參見注釋)
CMakeLists.txt

cmake_minimum_required(VERSION 3.4.1)

#設(shè)置生成的so動態(tài)庫最后輸出的路徑
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/libs/${ANDROID_ABI})

#.h文件目錄
include_directories(
        ${CMAKE_SOURCE_DIR}/src/main/cpp/include #h文件目錄
)

add_library( # Sets the name of the library.
        ndkdemo-lib                     #c/cpp代碼將要編譯成為so庫的名稱,java代碼加載庫文件要用這個(gè)名稱
        SHARED                          #動態(tài)庫
        src/main/cpp/c_test.c           #cpp代碼文件路徑 可以在下面接著隨意添加c愈捅、c++文件
        src/main/cpp/cpp_test.cpp
        src/main/jni/ndkdemo-lib.c      #參見step 5
        src/main/jni/ndkdemo-lib.cpp    #參見step 5
)

find_library( #調(diào)用系統(tǒng)庫
              log-lib                   #打印用
              log )

target_link_libraries( # Specifies the target library.
                       ndkdemo-lib
                       ${log-lib} )


Step3 Link C++ Project with Gradle

切換到Android視圖,右鍵app慈鸠,選擇" Link C++ Project with Gradle"



設(shè)置step2中新建的CMakeLists.txt的路徑


Step4 添加java代碼

在MainActivity中蓝谨,System.loadLibrary()加載so庫,并添加相關(guān)native方法青团,代碼如下:

public class MainActivity extends AppCompatActivity {
    private TextView ctxt;
    private TextView cpptxt;
    static {
        System.loadLibrary("ndkdemo-lib");
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ctxt = findViewById(R.id.ctxt);
        ctxt.setText(stringFromC());
        cpptxt = findViewById(R.id.cpptxt);
        cpptxt.setText(stringFromCpp());
    }
    public static native String stringFromC();
    public static native String stringFromCpp();
}

布局文件(activity_main.xml)如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">
    <TextView
        android:id="@+id/ctxt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <TextView
        android:id="@+id/cpptxt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

Step5 添加JNI層代碼

光標(biāo)定位到MainActivity中的public static native String stringFromC()譬巫,Alt+Enter后AS會自動新建ndkdemo-lib.c文件和相關(guān)函數(shù)頭,在ndkdemo-lib.c添加以下代碼:

#include <jni.h>
#include "c_test.h"
JNIEXPORT jstring JNICALL
Java_com_example_chaoyc_ndkdemo_MainActivity_stringFromC(JNIEnv *env, jclass type)
{
    const char * cStr = cFunction();
    return (*env)->NewStringUTF(env, cStr);
}
注:C++代碼調(diào)用的不同

在step5路徑(即app/src/main/jni/)新建ndkdemo-lib.cpp文件督笆,添加代碼如下:

#include <jni.h>
#include "cpp_test.h"
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_chaoyc_ndkdemo_MainActivity_stringFromCpp(
        JNIEnv *env,
        jclass type)
{
    const char * cppStr = cppFunction();
    return env->NewStringUTF(cppStr);
}

Step6 查看運(yùn)行結(jié)果和編譯生成的.so庫

運(yùn)行結(jié)果如下:



根據(jù)CMakeLists.txt中指定的路徑芦昔,生成的.so庫如下:


Ref

https://developer.android.google.cn/studio/projects/add-native-code

筆者水平有限,歡迎留言交流娃肿!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咕缎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子料扰,更是在濱河造成了極大的恐慌凭豪,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晒杈,死亡現(xiàn)場離奇詭異嫂伞,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門帖努,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撰豺,“玉大人,你說我怎么就攤上這事拼余∥坭耄” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵姿搜,是天一觀的道長寡润。 經(jīng)常有香客問我,道長舅柜,這世上最難降的妖魔是什么梭纹? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮致份,結(jié)果婚禮上变抽,老公的妹妹穿的比我還像新娘。我一直安慰自己氮块,他們只是感情好绍载,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著滔蝉,像睡著了一般击儡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蝠引,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天阳谍,我揣著相機(jī)與錄音,去河邊找鬼螃概。 笑死矫夯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的吊洼。 我是一名探鬼主播训貌,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼冒窍!你這毒婦竟也來了递沪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤超燃,失蹤者是張志新(化名)和其女友劉穎区拳,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體意乓,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡樱调,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年约素,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笆凌。...
    茶點(diǎn)故事閱讀 39,953評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡圣猎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出乞而,到底是詐尸還是另有隱情送悔,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布爪模,位于F島的核電站欠啤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏屋灌。R本人自食惡果不足惜洁段,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望共郭。 院中可真熱鬧祠丝,春花似錦、人聲如沸除嘹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尉咕。三九已至叠蝇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間年缎,已是汗流浹背蟆肆。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晦款,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓枚冗,卻偏偏與公主長得像缓溅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子赁温,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評論 2 355