欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Android NDK開(kāi)發(fā)入門(mén)實(shí)例

Android NDK開(kāi)發(fā)入門(mén)實(shí)例

分類(lèi): Android C++ JAVA 4327人閱讀 評論(6) 收藏 舉報

目錄(?)[+]

  

Android NDK開(kāi)發(fā)入門(mén)實(shí)例

        寫(xiě)這個(gè),目的就是記錄一下我自己的NDK是怎么入門(mén)的。便于以后查看,而不會(huì )忘了又用搜索引擎一頓亂搜。然后希望能夠幫助剛學(xué)的人入門(mén)。先轉一段別人說(shuō)的話(huà):

“NDK全稱(chēng):Native Development Kit。

1、NDK是一系列工具的集合。

* NDK提供了一系列的工具,幫助開(kāi)發(fā)者快速開(kāi)發(fā)C(或C++)的動(dòng)態(tài)庫,并能自動(dòng)將so和java應用一起打包成apk。這些工具對開(kāi)發(fā)者的幫助是巨大的。

* NDK集成了交叉編譯器,并提供了相應的mk文件隔離CPU、平臺、ABI等差異,開(kāi)發(fā)人員只需要簡(jiǎn)單修改mk文件(指出“哪些文件需要編譯”、“編譯特性要求”等),就可以創(chuàng )建出so。

* NDK可以自動(dòng)地將so和Java應用一起打包,極大地減輕了開(kāi)發(fā)人員的打包工作。

2、NDK提供了一份穩定、功能有限的API頭文件聲明。

Google明確聲明該API是穩定的,在后續所有版本中都穩定支持當前發(fā)布的API。從該版本的NDK中看出,這些API支持的功能非常有限,包含有:C標準庫(libc)、標準數學(xué)庫(libm)、壓縮庫(libz)、Log庫(liblog)?!?/span>

在深入理解之前,暫且就把NDK當成是一種工具,這種工具使得JAVA能夠使用C/C++編譯出的so包。并將此包一起打入apk包中。

下面開(kāi)始正式入門(mén):

一、開(kāi)發(fā)環(huán)境搭建(以Windows平臺下為例,Linux平臺下類(lèi)似)

1.      下載NDK壓縮包,至于從哪里下載借助搜索引擎吧。

2.       解壓NDK壓縮包,配置環(huán)境變量。將解壓的地址寫(xiě)入環(huán)境變量PATH中

3.       在命令提示符下輸入ndk-build如果彈出如下的錯誤,而不是說(shuō)ndk-build not found,就說(shuō)明ndk環(huán)境已經(jīng)安裝成功了。特別提示一下,搜索引擎中會(huì )告訴一些早期的NDK版本的使用,是在命令提示符下輸入build/host-setup.sh;但是NDK經(jīng)過(guò)更新,這個(gè)文件已經(jīng)沒(méi)有了。只需要輸入ndk-build就可以了。

Android NDK: Could not find application project directory !   
Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.   
/home/braincol/workspace/android/android-ndk-r5/build/core/build-local.mk:85: *** Android NDK: Aborting    .  Stop.

4.       cygwin的安裝,至于如何安裝,從哪里安裝也去借助搜索引擎吧。在Cygwin安裝過(guò)程中,可能比較慢,必須安裝的項目有make和gcc;建議安裝下面幾個(gè)包:autoconf2.1 ,automake1.10 ,binutils ,gcc-core ,gcc4-core ,gdb ,pcre ,pcre-devel,都安裝最新版本。安裝完畢后,運行Cygwin,輸入"make -v"和"gcc -v"來(lái)檢測是否安裝成功;make版本要在3.81以上。

5.       以上任務(wù)結束后,就表示基本的開(kāi)發(fā)環(huán)境搭建完成了。

二、編寫(xiě)JAVA代碼

1.       建立一個(gè)android的工程TestNDK,創(chuàng )建TestNDK.java文件。

TestNDK.java:

  1. package com.blueeagle.example;  
  2.   
  3. import android.app.Activity;  
  4. import android.widget.TextView;  
  5. import android.os.Bundle;  
  6.   
  7.   
  8. public class TestNDK extends Activity  
  9. {  
  10.     @Override  
  11.     public void onCreate(Bundle savedInstanceState)  
  12.     {  
  13.         super.onCreate(savedInstanceState);  
  14.   
  15.         TextView  myTextView = new TextView(this);  
  16.         myTextView.setText( stringTestNdk() );  
  17.         setContentView(myTextView);  
  18.     }  
  19.   
  20.     public native String  stringTestNdk ();  
  21.     public native String  stringTestNdk2 ();  
  22.   
  23.     static {  
  24.         System.loadLibrary("testNDK");  
  25.     }  
  26. }  


 

2.       必要的一些說(shuō)明

  1. static   
  2.   
  3. {  
  4. System.loadLibrary("testNDK ");  
  5. }  

表明程序開(kāi)始運行的時(shí)候會(huì )加載testNDK, static區聲明的代碼會(huì )先于onCreate方法執行。如果程序中有多個(gè)類(lèi),而且如果TestNDK這個(gè)類(lèi)不是你應用程序的入口,那么testNDK(完整的名字是lib testNDK.so)這個(gè)庫會(huì )在第一次使用TestNDK這個(gè)類(lèi)的時(shí)候加載。

  1. public native String stringTestNdk ();  
  2. public native String stringTestNdk 2();  

可以看到這兩個(gè)方法的聲明中有 native 關(guān)鍵字, 這個(gè)關(guān)鍵字表示這兩個(gè)方法是本地方法,也就是說(shuō)這兩個(gè)方法是通過(guò)本地代碼(C/C++)實(shí)現的,在java代碼中僅僅是聲明。

用eclipse編譯該工程,生成相應的.class文件,這步必須在下一步之前完成,因為生成.h文件需要用到相應的.class文件。暫時(shí)不考慮報錯信息。

3.       生成.h文件

在C/C++文件編寫(xiě)之前,需要利用javah這個(gè)工具生成相應的.h文件,然后根據這個(gè).h文件編寫(xiě)相應的C/C++代碼。

進(jìn)入到剛才建立的testNDK工程目錄中,查看工程文件:AndroidManifest.xml  assets  bin  default.properties  gen  res  src并新建一個(gè)ndk的文件夾后就可以進(jìn)行.h文件的生成了。

       在工程目錄下執行: javah -classpath bin -d ndk com.blueeagle.example.TestNDK

這里-classpath表示類(lèi)的路徑;-d ndk 表示生成的.h文件存放的目錄;com.blueeagle.example.TestNDK則是完整的類(lèi)名。

       現在可以再ndk目錄下看到多了一個(gè).h文件:com_blueeagle_example_testNDK.h;打開(kāi)后,可以看到.h的內容:

com_blueeagle_example_testNDK.h:

  1. #include <jni.h>  
  2.   
  3. #ifndef _Included_com_blueeagle_example_testNDK  
  4. #define _Included_com_blueeagle_example_testNDK  
  5. #ifdef __cplusplus  
  6. extern "C" {  
  7. #endif  
  8. /* 
  9.  * Class:     com_blueeagle_example_testNDK 
  10.  * Method:    stringTestNdk 
  11.  * Signature: ()Ljava/lang/String; 
  12.  */  
  13. JNIEXPORT jstring JNICALL Java_ com_blueeagle_example_testNDK_stringTestNdk  
  14.   (JNIEnv *, jobject);  
  15.   
  16. /* 
  17.  * Class:     com_blueeagle_example_testNDK 
  18.  * Method:    stringTestNdk2 
  19.  * Signature: ()Ljava/lang/String; 
  20.  */  
  21. JNIEXPORT jstring JNICALL Java_ com_blueeagle_example_testNDK_stringTestNdk2  
  22.   (JNIEnv *, jobject);  
  23.   
  24. #ifdef __cplusplus  
  25. }  
  26. #endif  
  27. #endif  


 

上面代碼中的JNIEXPORT 和 JNICALL 是jni的宏,在android的jni中不需要,當然寫(xiě)上去也不會(huì )有錯。

函數名比較長(cháng)但是完全按照:java_pacakege_class_mathod 形式來(lái)命名。

也就是說(shuō):

TestNDK.java中stringTestNdk() 方法對應于 C/C++中的 Java_com_blueeagle_example_testNDK_ stringTestNdk() 方法

TestNDK.java中stringTestNdk2() 方法對應于 C/C++中的 Java_com_blueeagle_example_testNDK_ stringTestNdk2() 方法

注意下其中的注釋?zhuān)?/p>

Signature: ()Ljava/lang/String;

()Ljava/lang/String;

()表示函數的參數為空(這里為空是指除了JNIEnv *, jobject 這兩個(gè)參數之外沒(méi)有其他參數,JNIEnv*, jobject是所有jni函數必有的兩個(gè)參數,分別表示jni環(huán)境和對應的java類(lèi)(或對象)本身),

Ljava/lang/String; 表示函數的返回值是java的String對象。

三、編寫(xiě)C/C++文件

testNDK.c:

  1. #include <string.h>  
  2. #include <jni.h>  
  3.   
  4. jstring  
  5. Java_com_blueeagle_example_testNDK_stringTestNdk( JNIEnv* env,  
  6.                                                   jobject thiz )  
  7. {  
  8.     return (*env)->NewStringUTF(env, "Hello Test NDK !");  
  9. }  


 

這里只是實(shí)現了Java_com_blueeagle_example_testNDK_stringTestNdk方法,而Java_com_blueeagle_example_testNDK_stringTestNdk2 方法并沒(méi)有實(shí)現,因為在testNDK.java中只調用了stringTestNdk ()方法,所以stringTestNdk 2()方法沒(méi)有實(shí)現也沒(méi)關(guān)系,不過(guò)建議最好還是把所有java中定義的本地方法都實(shí)現了。

Java_com_blueeagle_example_testNDK_stringTestNdk 函數只是簡(jiǎn)單的返回了一個(gè)內容為 "Hello Test NDK !" 的jstring對象(對應于java中的String對象)。

testNDK.c文件就已經(jīng)編寫(xiě)好了,這時(shí)的.h文件已經(jīng)沒(méi)有用了。

 

四、編譯生成相應的庫

1     首先需要編寫(xiě)Android.mk文件

在testNDK.c的同級目錄下新建一個(gè)Android.mk的文件

[javascript] view plaincopy?
  1. LOCAL_PATH := $(call my-dir)  
  2.   
  3. include $(CLEAR_VARS)  
  4.   
  5. LOCAL_MODULE    := testNDK  
  1. LOCAL_SRC_FILES := testNDK.c  
  2.   
  3. include $(BUILD_SHARED_LIBRARY)  


 

這個(gè)Androd.mk文件很短,下面我們來(lái)逐行解釋下:

LOCAL_PATH := $(call my-dir)

一個(gè)Android.mk 文件首先必須定義好LOCAL_PATH變量。它用于在開(kāi)發(fā)樹(shù)中查找源文件。在這個(gè)例子中,宏函數’my-dir’, 由編譯系統提供,用于返回當前路徑(即包含Android.mk file文件的目錄)。

include $( CLEAR_VARS)

CLEAR_VARS由編譯系統提供,指定讓GNU MAKEFILE為你清除許多LOCAL_XXX變量(例如 LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, 等等...),
除LOCAL_PATH 。這是必要的,因為所有的編譯控制文件都在同一個(gè)GNU MAKE執行環(huán)境中,所有的變量都是全局的。

LOCAL_MODULE := testNDK

編譯的目標對象,LOCAL_MODULE變量必須定義,以標識你在A(yíng)ndroid.mk文件中描述的每個(gè)模塊。名稱(chēng)必須是唯一的,而且不包含任何空格。

注意:編譯系統會(huì )自動(dòng)產(chǎn)生合適的前綴和后綴,換句話(huà)說(shuō),一個(gè)被命名為'hello-jni'的共享庫模塊,將會(huì )生成'libhello-jni.so'文件。

重要注意事項:

如果你把庫命名為‘libtestNDK’,編譯系統將不會(huì )添加任何的lib前綴,也會(huì )生成libfoo.so,這是為了支持來(lái)源于A(yíng)ndroid平臺的源代碼的Android.mk文件,如果你確實(shí)需要這么做的話(huà)。

LOCAL_SRC_FILES := testNDK.c

LOCAL_SRC_FILES變量必須包含將要編譯打包進(jìn)模塊中的C或C++源代碼文件。注意,你不用在這里列出頭文件和包含文件,因為編譯系統將會(huì )自動(dòng)為你找出依賴(lài)型的文件;僅僅列出直接傳遞給編譯器的源代碼文件就好。

注意,默認的C++源碼文件的擴展名是’.cpp’. 指定一個(gè)不同的擴展名也是可能的,只要定義LOCAL_DEFAULT_CPP_EXTENSION變量,不要忘記開(kāi)始的小圓點(diǎn)(也就是’.cxx’,而不是’cxx’)

include $(BUILD_SHARED_LIBRARY)

BUILD_SHARED_LIBRARY表示編譯生成共享庫,是編譯系統提供的變量,指向一個(gè)GNU Makefile腳本,負責收集自從上次調用'include $(CLEAR_VARS)'以來(lái),定義在LOCAL_XXX變量中的所有信息,并且決定編譯什么,如何正確地去做。還有 BUILD_STATIC_LIBRARY變量表示生成靜態(tài)庫:lib$(LOCAL_MODULE).a, BUILD_EXECUTABLE 表示生成可執行文件。

2         其次進(jìn)行編譯

進(jìn)入到工程根目錄,輸入ndk-build即可生成相應的庫libs/armeabi/testNDK.so

五、在eclipse重新編譯HelloJni工程,生成apk

重新編譯testNDK工程,將so包打入工程apk包,即可看到結果。在模擬器上顯示Hello Test NDK!

 

希望能夠給后來(lái)的人提供幫助!

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Linux下Android NDK環(huán)境配置以及配合eclipse使用NDK
史上最全系列之開(kāi)發(fā)環(huán)境搭建之NDK
NDK搭建Android開(kāi)發(fā)環(huán)境
一步一步了解Cocos2dx 3.0 正式版本開(kāi)發(fā)環(huán)境搭建(Win32/Android)
apk打包技巧
基于 Android NDK 的學(xué)習之旅-----序言
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久