真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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)自行繞路。

創(chuàng)新互聯(lián)成立與2013年,先為武昌等服務(wù)建站,武昌等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為武昌企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。

1、準(zhǔn)備

    做NDK開(kāi)發(fā)是非常要注意開(kāi)發(fā)環(huán)境和開(kāi)發(fā)版本的(個(gè)人認(rèn)為)。我使用的是Eclipse (Luna 4.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)的彈窗中做以下配置

        

Android ndk開(kāi)發(fā)

Android ndk開(kāi)發(fā)

Android ndk開(kāi)發(fā)

    3、右鍵項(xiàng)目工程Android tools - Add Native Support  

Android ndk開(kāi)發(fā)

出現(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 
#include
/**
* 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 
#include
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,"","()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)容為

LOCAL_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 
#include 
#include 
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 = f1();
        dlclose(filehandle);
	filehandle = NULL;
    }
    return i;
}

以上內(nèi)容除了沒(méi)有涉及到真正的C/C++編程外,JNI開(kāi)發(fā)的一些知識(shí)點(diǎn)都涉及到了,僅屬入門(mén)的一些知識(shí),在完全不了解C/C++編程的情況下耗費(fèi)了2天時(shí)間才積累了以上知識(shí)。如果還需要更深入的學(xué)習(xí)就需要學(xué)習(xí)C/C++的語(yǔ)法知識(shí)以及編譯。

以上的代碼以及操作不一定在其他的環(huán)境中有效,謹(jǐn)記。


網(wǎng)頁(yè)題目:Androidndk開(kāi)發(fā)
文章起源:http://weahome.cn/article/ijshgc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部