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