NDK(三方库引入、Mk文件)
?
NDK筆記-----第三方庫引入
一、字符操作: 1
二、NDK*(JNI)對(duì)象操作: 2
1、C++調(diào)用java對(duì)象 3
三、Android.mk說明: 3
四、Application.mk說明 3
五、第三方庫使用 4
1、動(dòng)態(tài)庫 4
1.1、使用NDK編譯動(dòng)態(tài)庫并使用: 4
1.2、使用編譯好的動(dòng)態(tài)庫: 6
2、靜態(tài)庫 7
2.1、NDK編譯靜態(tài)庫 7
2.1、使用已有的靜態(tài)庫: 7
?
注意:
C++:
Android項(xiàng)目:
Jni-c++源文件
方法:extern?"C"?{}包裹;
或 ?使用宏修飾。C不需要
頭文件?cmd:javah-全類名。?會(huì)在環(huán)境變量classpath中查找依賴的類
?
一、字符操作:
Java傳遞的jstring字符串無法直接在native使用,需要轉(zhuǎn)換。
使用GetStringUFTChars得到const?char?*?有時(shí)無法滿足操作。
?
#注意釋放資源
Malloc表示申請(qǐng)固定內(nèi)存。而new會(huì)直接調(diào)用構(gòu)造創(chuàng)建,不需要手動(dòng)申請(qǐng)內(nèi)存。
Malloc對(duì)應(yīng)free;??char*?X?=?new?char[10]?對(duì)應(yīng)?delete?X;
?
C++獲取字符串指針操作
string?to?const?char*?========??.c_str()??.data();
const?char*、char*?to?string?=====?string?變量(char)
?
const
C++內(nèi)存分配:
?
對(duì)于非指針
| const?TYPE?value; 它的含義是:const修飾的類型為TYPE的變量value是不可變的(只讀)。 ? |
?
?
對(duì)于指針
B.?char?*?const?pContent; C.?char?const?*pContent; D.?const?char*?const?pContent; 如果const位于*的左側(cè),則const就是用來修飾指針?biāo)赶虻淖兞?#xff0c;即指針指向?yàn)槌A?#xff1b; A:指向常量(ps:改變只報(bào)警告) B:指針為常量,不能改變指向。 |
?
倒過來讀:
Char*?? 指向字符【的指針】
Char*?const? 常量(靜態(tài)指針)指向字符,即指向不可變
Const?char*?? 指向字符常量【的指針】
?
二、NDK*(JNI)對(duì)象操作:
?
查看簽名:進(jìn)入到類文件所在目錄
Javap?–s?類名
?
1、C++調(diào)用java對(duì)象
?
?
?
三、Android.mk說明:
LOCAL_PATH?:=?$(call?my-dir) 包含Android.mk?file文件的目錄??
include?$(CLEAR_VARS) ??????????清除LOCAL_XXX變量????
LOCAL_MODULE????:=?json ??文件名(不含后綴和lib)
LOCAL_SRC_FILES?:=?lib/libjson.a 文件路徑?? ????
include?$(PREBUILT_STATIC_LIBRARY) 預(yù)加載靜態(tài)庫????
LOCAL_STATIC_LIBRARIES?:=?json 使用靜態(tài)庫
LOCAL_LDLIBS????:=?-llog 使用庫(動(dòng)靜)
include?$(BUILD_SHARED_LIBRARY) 共享庫(動(dòng)態(tài)庫)
include?$(BUILD_STATIC_LIBRARY) 靜態(tài)庫
?
注意:第三方庫的引入會(huì)在ndk目錄下查找,所以當(dāng)庫不存在時(shí)需要指明查找路徑。
如果已經(jīng)定義好了庫模塊同時(shí)使用LOCAL_STATIC(SHARED)_LIBRIRES導(dǎo)入只 需要?:=模塊名
四、Application.mk說明
放入myapp/jin/application.mk或myapp/application.mk
?
APP_PROJECT_PATH?:=? 應(yīng)用程序工程根目錄的絕對(duì)路徑j(luò)ni下可選
APP_ABI?:=?armeabi-v7a支持ARMv7? armeabi支持ARMv5
APP_CPPFLAGS?+=-fexceptions??開啟exception會(huì)根據(jù)application 的debug節(jié)點(diǎn)
NDK構(gòu)建系統(tǒng)提供由Android系統(tǒng)給出的最小C++運(yùn)行時(shí)庫
指定:
頭文件引入:
APP_STL?:=?stlport_static????-->?static?STLport?library
???????APP_STL?:=?stlport_static????-->?靜態(tài)STLport庫
???????APP_STL?:=?stlport_shared????-->?shared?STLport?library
???????APP_STL?:=?stlport_shared????-->?動(dòng)態(tài)STLport庫
???????APP_STL?:=?system????????????-->?default?C++?runtime?library
???????APP_STL?:=?system????????????-->?默認(rèn)的C++運(yùn)行時(shí)庫
gnustl_static ----- 標(biāo)準(zhǔn)STL?c++庫
?
Jsoncpp+NDK目錄:
?
五、第三方庫使用
1、動(dòng)態(tài)庫
---------------------------------jsoncpp動(dòng)態(tài)庫-----------------------------------------
?
1.1、使用NDK編譯動(dòng)態(tài)庫并使用:
jsoncpp-src-0.6.0-rc2-amalgamation.tar?----?.h、.app混合版
?
Jsoncpp解壓---jni/文件名/解壓文件
Android.mk:
?
Test:測試
Android.mk:
?
Jin:
Android.mk
?
?
?
?
合并一個(gè)Android.mk
?
?
1.2、使用編譯好的動(dòng)態(tài)庫:
動(dòng)態(tài)庫放入jni/XX文件下
?
?
?
2、靜態(tài)庫
------------------------------------------靜態(tài)庫----------------------------------------------
?
2.1、NDK編譯靜態(tài)庫
注意:NDK編譯的靜態(tài)庫會(huì)存在與
?
編譯好后直接使用
?
2.1、使用已有的靜態(tài)庫:
將需要的靜態(tài)庫放入jni下
?
?
?
六、資源釋放:
1、字符串
env->ReleaseStringUTFChars(jstr,?jcstr);
Jstr-----jstring類型
Jcstr----jstring的引用
如:
?
Jstr是jstring類型,是來源。
?
釋放類、方法和對(duì)象(jstring是對(duì)象,不是基本數(shù)據(jù)類型)
?
?
?
演示JSONCPP使用:
?
?
Value?root:?Jsoncpp對(duì)象,這里使用Reader會(huì)出錯(cuò)。
?
資源被釋放又傳遞回java
?
?
?
GDB調(diào)試
?
Cygwin?------?cd?工程?-----ndk-gdb(未啟動(dòng)加上?--start)
?file?工程obj下的so
轉(zhuǎn)載于:https://www.cnblogs.com/xiaosw/p/3527458.html
總結(jié)
以上是生活随笔為你收集整理的NDK(三方库引入、Mk文件)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mirror--镜像使用的工作线程数
- 下一篇: HDU 1159 Common Subs