下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Androidndk開(kāi)發(fā)
前言:我對(duì)C/C++是沒(méi)有任何基礎(chǔ)的,雖然大學(xué)中學(xué)了一個(gè)學(xué)期的C但是都算還給老師了。這篇文章是我做一個(gè)NDK項(xiàng)目積累下來(lái)的知識(shí),可以說(shuō)是一篇小白上手文章,所以高手請(qǐng)自行繞路。1、準(zhǔn)備
做NDK開(kāi)發(fā)是非常要注意開(kāi)發(fā)環(huán)境和開(kāi)發(fā)版本的(個(gè)人認(rèn)為)。我使用的是Eclipse(Luna4.4.0),NDK版本r10,應(yīng)該是在<=r6版本的NDK還需要安裝cygwin(這這里就不討論,網(wǎng)上大把資料),附上NDK的下載鏈接方便不能×××的朋友,32位
,64位,網(wǎng)站不能訪問(wèn),但是直接用下載鏈接是可以下載到的。
安裝好NDK后,就需要在Eclipse上進(jìn)行配置了。
1、windows-preferences-android-ndk-ndklocation
選擇ndk的安裝目錄
2、配置builder環(huán)境在需要進(jìn)行ndk開(kāi)發(fā)的項(xiàng)目上右鍵-properties-builder-new-program在出現(xiàn)的彈窗中做以下配置
3、右鍵項(xiàng)目工程Androidtools-AddNativeSupport
出現(xiàn)jni目錄以及Android.mk,xx.cpp就說(shuō)明添加成功了。就可以進(jìn)行NDK開(kāi)發(fā)了。2、Java調(diào)用C++中的方法。例如:獲取從C++文件中獲取字符串并打印在Activity類A中:static{
System.loadLibrary("xx");//xx是Android.mk文件中LOCAL_MODULE
的字段
}
//必須和ndk中的方法名一樣
public
native
String
getString();
//onclick方法
public
void
click(View
v){
String
str
=
getString();
System.out.println("調(diào)用JNI中的方法:"+str);
}在ndk.cpp中#include
<jni.h>
#include<string.h>
/**
*
extern
"C"
是必須加的,經(jīng)測(cè)試不加的話方法調(diào)用不成功,也沒(méi)找到答案,有知道為什么的請(qǐng)*
告知,方法名稱必須按照J(rèn)NI的規(guī)范來(lái)Java_包名_類名_方法名,都必須以'_'隔開(kāi)。
*/
extern
"C"
jstring
Java_com_test_ndk_A_getString(JNIEnv*
env,jobject
thiz){
jstring
str
;
//在C中的是以(*env)->調(diào)用的,網(wǎng)上大部分的博客文檔也是這種情況。
str
=
env->newStringUTF("hello
world");//不能使用中文,不然會(huì)報(bào)錯(cuò)。
return
str;
}運(yùn)行工程即可看到效果。3、C++中調(diào)用Java方法在ClassB中static{
System.loadLibrary("ndk");
}
public
native
void
loadJavaMethod();
public
void
f1(){
String
str
;
str
=
"hello
world
from
java";
System.out.println(str);
}
public
String
f2(){
String
str
;
str
=
"f2:
hello
world
from
java";
System.out.println(str);
return
str;
}
public
void
f3(String
str,int
i){
System.out.println("f3
內(nèi)容為:"+str+",數(shù)字為:"+i);
}在ndk.cpp中#include
<jni.h>
#include<string.h>
extern
"C"
void
Java_com_test_ndk_B_loadJavaMethod(JNIEnv
*env,jobject
thiz){
//調(diào)用無(wú)參無(wú)返回值的方法
jclass
cls
=
env->GetObjectClass(thiz);
//GetMethodID("jclass對(duì)象","方法名","方法參數(shù)")
jmethodID
mID
=
env->GetMethodID(cls,"f1","()V");
if(mID
!=
NULL){
env->CallVoidMethod(thiz,mID);
}
//調(diào)用有參無(wú)返回值得方法
//參數(shù)類型除了基本數(shù)據(jù)類型外,其他的都需要按照這樣的格式
//L包名/類名;
包名用/分割,必須以;結(jié)束
//詳情請(qǐng)參考這篇文章
jclass
cls
=
env->GetObjectClass(thiz);
jmethodID
mID
=
env->GetMethodID(cls,"f3","(Ljava/lang/String;I)V");
jstring
content
=
env->NewStringUTF("hehe");
jint
i
=
10;
if(mID
!=
NULL){
env->CallVoidMethod(thiz,mID,content,i);
}
//調(diào)用有返回值無(wú)參的方法
jclass
cls
=
env->GetObjectClass(thiz);
jmethodID
mID
=
env->GetMethodID(cls,"f2","()Ljava/lang/String;");
if(mID
!=
NULL){
env->CallObjectMethod(thiz,mID);
}
//調(diào)用其他類中的方法假設(shè)有一個(gè)Student類,如果要使用Student類中的內(nèi)部類A,格式為
//com/test/ndk/Student$A
jclass
stu
=
env->FindClass("com/test/ndk/Student");
//實(shí)例化無(wú)參構(gòu)造方法
jobject
stuObj
=
env->NewObject(stu,env->GetMethodID(stu,"<init>","()V"));
jmethodID
getNameId
=
env->GetMethodID(stu,"getName","()V");
if(getNameId
!=NULL){
env->CallVoidMethod(stuObj,getNameId);
}
}4、在自己的so文件中調(diào)用第三方的so文件這種情況一般是因?yàn)榈谌降腃/C++中的方法不是按照J(rèn)NI的規(guī)范來(lái)寫(xiě),這時(shí)就需要進(jìn)行重新包裝,并使用,當(dāng)然前提是有了第三方的說(shuō)明文檔。將第三方的so文件配置到預(yù)編譯環(huán)境在工程的jni文件下新建prebuilt文件夾(名稱隨意)將第三方的so文件放到里面例如libthird.so,然后在這個(gè)文件夾下新建Androdid.mk文件,文件內(nèi)容為L(zhǎng)OCAL_PATH
:=
$(call
my-dir)
include
$(CLEAR_VARS)
LOCAL_MODULE
:=
libthird
LOCAL_SRC_FILES
:=
libthird.so
include
$(PREBUILT_SHARED_LIBRARY)打開(kāi)jni下的Android.mk文件,加入以下字段LOCAL_PATH
:=
$(call
my-dir)
include
$(CLEAR_VARS)
LOCAL_MODULE
:=
ndk
LOCAL_SRC_FILES
:=
ndk.cpp
#名稱和第三方mk中LOCAL_MODULE定義的名稱一樣
LOCAL_SHARED_LIBRARIES
:=
libthird
include
$(BUILD_SHARED_LIBRARY)
#添加路徑
include
$(LOCAL_PATH)/prebuilt/Android.mk
配置完成后,在工程的libs\armeabi目錄下可以看到第三方的so文件,注意不能直接將第三方的so文件放到這個(gè)目錄下。否則在builde的時(shí)候會(huì)刪除。假設(shè)在第三方的C/C++文件中有這樣一個(gè)方法//extern
"C"在第三方的包中的方法也必須添加,測(cè)試時(shí),如果不添加方法調(diào)用不成功,但這個(gè)是不能限//制到第三方的,有待解決
extern
"C"
int
f1(){
return
101;
}
在自己的C/C++文件中調(diào)用第三方的方法
#include
<jni.h>
#include
<dlfcn.h>
#include
<fcntl.h>
void
*filehandle
=
NULL;
jstring
(*f1)()
=NULL;
extern
"C"
jint
Java_com_test_ndk_classA_f1(JNIEnv
*
env,jobject
thiz){
jint
i
;
filehandle
=
dlopen("/data/data/com.fly.ndk2/lib/libndk.so",
RTLD_LAZY);
if(filehandle){
f1
=
(int(*)())dlsym(filehandle,"f1");
}
if(f1){
i
=
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度機(jī)房設(shè)備搬遷與搬遷期間安全保障服務(wù)合同3篇
- 2025年新型建筑材料采購(gòu)供應(yīng)合同范本4篇
- 2025年度醫(yī)院臨床檢驗(yàn)中心檢驗(yàn)師勞動(dòng)合同4篇
- 二零二五年度新能源儲(chǔ)能項(xiàng)目農(nóng)民工勞務(wù)合同規(guī)范4篇
- 二零二五版年薪制勞動(dòng)合同:大數(shù)據(jù)分析行業(yè)專家協(xié)議4篇
- 2025年度農(nóng)行房貸利率調(diào)整專項(xiàng)合同書(shū)2篇
- 二零二五白蟻滅治與老舊建筑改造服務(wù)合同3篇
- 二零二五年度建筑工程合同履行補(bǔ)充協(xié)議范本3篇
- 個(gè)人承包旅游景區(qū)開(kāi)發(fā)與經(jīng)營(yíng)合同(2024版)3篇
- 二零二五年度節(jié)能環(huán)保門(mén)窗定制采購(gòu)合同2篇
- 壞死性筋膜炎
- 2024輸血相關(guān)知識(shí)培訓(xùn)
- 整式的加減單元測(cè)試題6套
- 股權(quán)架構(gòu)完整
- 山東省泰安市2022年初中學(xué)業(yè)水平考試生物試題
- 注塑部質(zhì)量控制標(biāo)準(zhǔn)全套
- 人教A版高中數(shù)學(xué)選擇性必修第一冊(cè)第二章直線和圓的方程-經(jīng)典例題及配套練習(xí)題含答案解析
- 銀行網(wǎng)點(diǎn)服務(wù)禮儀標(biāo)準(zhǔn)培訓(xùn)課件
- 二年級(jí)下冊(cè)數(shù)學(xué)教案 -《數(shù)一數(shù)(二)》 北師大版
- 晶體三極管資料
- 銀行內(nèi)部舉報(bào)管理規(guī)定
評(píng)論
0/150
提交評(píng)論