久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > AS(Android Studio)中使用(yong)NDK

AS(Android Studio)中使用(yong)NDK 時間:2018-09-25      來源:未(wei)知

在AS中(zhong)要想使用NDK,方法很簡(jian)單,只要在工程gradle.properties中(zhong)添(tian)加:

android.useDeprecatedNdk=true

在對(dui)應的module的build.gradle文件中(zhong)的defaultConfig下添(tian)加:

ndk{

moduleName "庫名"

}

這(zhe)兩段(duan)代碼指令(ling)就可(ke)以和在(zai)Eclipse中一樣使用NDK了(le)。

但是這里和(he)Eclipse中不同的地方是,每次Build之后,可(ke)能需要(yao)去將生成的動態庫文件移動到和(he)app\文件夾下(xia)的libs目錄中,這個是AS默認的庫文件訪問地址(zhi)。

這里(li)還有(you)一個問題,就是當(dang)我們(men)在(zai)Android.mk文件中(zhong)-llog或者(zhe)-lm的(de)時候會(hui)出(chu)現無法找(zhao)到對(dui)應庫的(de)問題。

這個問題的解決方法,其實就是(shi)放(fang)棄gradle為我們自動編譯,那么會不會很復雜呢,其實也不會,因為現在新版的ndk已(yi)經很智(zhi)能了。

同樣在build.gradle文件(jian)中的Android下(xia)添(tian)加:

sourceSets.main {

jni.srcDirs = []

jniLibs.srcDir 'src/main/libs'

}

 這(zhe)樣我們就將src/main/libs這(zhe)個目錄設置成(cheng)了(le)工程默認(ren)的(de)jni庫(ku)的(de)存放目錄了(le)。

接下來,我們(men)首先來明確一下我們(men)的庫名(ming),這個名(ming)字是可以任(ren)意起(qi)的,比如我們(men)叫它“MyNdk”。那么我們(men)生成的庫文件的名(ming)字就是“libMyNdk.so”。

根(gen)據(ju)上面(mian)的說(shuo)明,我們修改gradle.properties和build.gradle。

第二步,新建(jian)一個工程(cheng),這里推薦是為(wei)native方法專(zhuan)門(men)建(jian)立一個工程(cheng),聲明的(de)時候可以直接將native方法都聲明成static的(de)即可。比如(ru)這里新建(jian)了一個NdkMethod.java文件,代(dai)碼如(ru)下:

public class NdkMethod {

public static native int add(int a, int b);

}

接下來,通過這(zhe)個(ge).java文件(jian)生成我們.c文件(jian)需要使(shi)用的(de).h文件(jian)。具體的(de)方法是,在main文件(jian)夾下新(xin)建(jian)一個(ge)叫jni的(de)目(mu)錄(lu)(lu),然后在AS的(de)控(kong)制(zhi)臺中將(jiang)目(mu)錄(lu)(lu)切換(huan)到main下,輸入以下命令:

javah -d jni -cp java\ com.farsight.ji.myndk.NdkMethod

 其(qi)中(zhong)-d代表將文件放(fang)在什么位置(zhi),和(he)-o重命名不能同時使用,-cp就是-classpath是我(wo)們(men)java工程(cheng)的目(mu)錄(lu),后(hou)邊跟(gen)的就是我(wo)們(men)的java類。

生(sheng)成了.h文件之后,就需要去(qu)寫(xie)一個Android.mk了。

很多人可能對.mk文件不是很熟悉(xi),沒關系,jni使(shi)(shi)用(yong)的(de)(de)時(shi)候.mk使(shi)(shi)用(yong)簡單的(de)(de)就可以了,這里在jni目錄下(xia),寫Android.mk,如(ru)下(xia):

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_LDLIBS := -lm -llog

LOCAL_MODULE := myndk

LOCAL_SRC_FILES := myndk.c

include $(BUILD_SHARED_LIBRARY)

其中LOCAL_PATH就(jiu)是(shi)告訴編譯(yi)器我們(men)要(yao)編譯(yi)哪里(li)的東西,第二(er)條忽(hu)略,LOCAL_LDLIBS通(tong)過(guo)字(zi)面我們(men)也知道是(shi)鏈接(jie)庫(ku),-lm是(shi)math庫(ku),-llog是(shi),LOCAL_MODULE是(shi)我們(men)的庫(ku)名(ming),要(yao)保(bao)持一(yi)致,LOCAL_SRC_FILES,后(hou)邊就(jiu)是(shi)跟(gen)我們(men)要(yao)編譯(yi)的所(suo)有.c文件,后(hou)一(yi)句(BUILD_SHARED_LIBRARY)就(jiu)是(shi)指生成(cheng)動態(tai)共享(xiang)庫(ku),其實還可(ke)以生成(cheng)可(ke)執行文件,這里(li)大(da)家自己摸索吧,更簡單。

好了,下邊(bian)就是.c文件了,myndk.c文件如下:

#define LOGTAG "NDKTEST"

#include

#include "jni.h"

#include "stdio.h"

#include

#include "string.h"

 #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOGTAG, __VA_ARGS__)

#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOGTAG, __VA_ARGS__)

#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOGTAG, __VA_ARGS__)

JNIEXPORT jint JNICALL Java_com_farsight_ji_myndk_NdkMethod_add

(JNIEnv *env, jclass thiz, jint frist, jint second){

return frist + second;

}

可(ke)以自由發揮,后,編譯生(sheng)成.so庫吧(ba),同樣在AS的控制(zhi)臺,進入jni目(mu)錄:

ndk-build

然后cd .. 就(jiu)可(ke)以看到一個libs目(mu)錄(lu)了(le),在(zai)該目(mu)錄(lu)下,就(jiu)可(ke)以找到armeabi或者其他的文件夾,下邊就(jiu)有我們的.so庫了(le)。

當然,我們做了這么多工作就是想讓JAVA代碼來調(diao)用C/C++代碼,很簡單(dan),在我們想要調(diao)用的.java文件(jian)中聲明(ming)加載動態庫:

static {

System.loadLibrary("myndk");

}

然后(hou)就可以使用了:

Log.d("MYNDKTEST", "" + NdkMethod.add(1, 2));

AS中做NDK開發還是(shi)比較(jiao)簡單(dan)的。

上一篇:Android多線程編程

下一篇:DS18B20時序分析

熱點(dian)文(wen)章(zhang)推(tui)薦
華清學(xue)員(yuan)就業(ye)榜單(dan)
高薪學(xue)員(yuan)經驗分享
熱(re)點新(xin)聞推薦
前臺(tai)專線:010-82525158 企(qi)業培(pei)訓洽談(tan)專線:010-82525379 院校(xiao)合(he)作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,,京公海網安備11010802025203號

回到頂部