導航:首頁 > 操作系統 > androidndklibpng

androidndklibpng

發布時間:2022-06-10 07:19:54

android ndk與sdk

1. SDK

Android SDK(Android Software Development Kit),即Android軟體開發工具包,Android的SDK基於java實現,這意味著基於Android SDK進行開發的第三方應用都必須使用Java語言。但這並不等同於「第三方應用只能使用Java」,也就是說我們還可以採用C/C++語言。

2. NDK

NDK即Native Development Kit,眾所周知,Android程序運行在Dalvik虛擬機中,NDK允許用戶使用類似C / C++之類的原生代碼語言執行部分程序。

NDK是一系列工具的集合。它提供了一系列的工具,幫助開發者快速開發C(或C++)的動態庫,並能自動將so和java應用一起打包成apk(AndroidPackage的縮寫,Android安裝包)。這些工具對開發者的幫助是巨大的。它集成了交叉編譯器,並提供了相應的mk文件隔離CPU、平台、ABI等差異,開發人員只需要簡單修改mk文件(指出「哪些文件需要編譯」、「編譯特性要求」等),就可以創建出so。它可以自動地將so和Java應用一起打包,極大地減輕了開發人員的打包工作

NDK提供了一份穩定、功能有限的API頭文件聲明,Google明確聲明該API是穩定的,在後續所有版本中都穩定支持當前發布的API。從該版本的NDK中看出,這些API支持的功能非常有限,包含有:C標准庫(libc)、標准數學庫(libm)、壓縮庫(libz)、Log庫(liblog)。

為什麼使用NDK

(1) 代碼的保護。由於apk的java層代碼很容易被反編譯,而C/C++庫反匯難度較大。

(2) 可以方便地使用現存的開源庫。大部分現存的開源庫都是用C/C++代碼編寫的。

(3) 提高程序的執行效率。將要求高性能的應用邏輯使用C開發,從而提高應用程序的執行效率。

(4)便於移植。用C/C++寫得庫可以方便在其他的嵌入式平台上再次使用。

Ⅱ 「Android NDK 」是什麼,在什麼情況下使用

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

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

3、NDK的發布,使「Java+C」的開發方式終於轉正,成為官方支持的開發方式。

4、NDK將使Android平台支持C開發的開端。

NDK使得在android中,java可以調用C函數庫。我們都知道,java是半解釋型語言,很容易被反匯編後拿到源代碼文件,在開發一些重要協議時,我們為了安全起見,使用C語言來編寫這些重要的部分,來增大系統的安全性。還有,在一些接近硬體環境下,相信大家都清楚C與java的優劣。順帶提一下:NDK並不能顯著提升應用效率。why?我們都覺得C語言比起java來說效率要高出很多,一方面,隨著jdk的不斷更新,java的效率也隨之提高;另一方面,即便使用C語言編碼提高了應用效率,但是在java與C相互調用時平白又增大了開銷。

Ⅲ 關於Android NDK 開發方面的書籍有哪些推薦

我並不完全同意繁華的說法。 下面是我的觀點。 首先你必須明確你究竟是做什麼類型的Android開發。 目前最多的1.Android游戲 2.Android應用 而目前在我看來Android又分為幾種開發形式。這里底層驅動那部分不包括在內。 1.純Java 2.純c/c++ 3.java+c/c++ 純java寫Android當然java你必須得弄好。 java+ c/c++那你java更得學好。因為目前的java+c/c++的開發都是基於NDK的。而NDK更多的是依賴於java裡面已有的jni那部分。 至於純C我不知道有多少人目前在使用這部分進行開發。這一部分你就必須了解程序的生命周期以及了解c/c++。 經典的入門書的話。其實我個人覺得沒必要專門去買一本書。 你可以在網上搜索android開發入門。純Java的估計比較多 把環境一搭。創建第一個項目把所有的目錄。把控制項用demo熟悉一遍。再來個舉一反三。接著研究一下服務 資料庫 協議 。再進行項目實際練習。完了做完小個項目想一下。就差不多入門了。 至於java+c/c++那你研究完這部分之後再研究一下jni。然後完了你還得研究一下gnu你得知道Android的makefile怎麼去寫。接著你還得了解如何進行庫移植。jni這部分最大的好處就是庫移植。這樣等你入門基本上得小半年。而且興許你還覺得自己沒學什麼。當然那些對程序理解很深刻的其他語言大牛應該會快些。 接著說純C。這方面的資料網上極少。最多的是google給的官方demo看哪個nativeactivity自己去研究。當然Guide寫過一本相關的書。很牛掰。全英文。寫得狠好。裡面涉及到opengl opensl glue libpng EGL等不過遺憾的是google目前為止還沒開放控制項介面。不過我想以後肯定會有。不過沒控制項可以自己寫不過這樣的深度應該是一個環球旅遊。也就是說做應用這種方式的挑戰比較大。 一看寫了挺多的。呵呵不由想起我自學Android的經歷。凄涼啊。

Ⅳ Android NDK開發簡介 NDK和SDK以及JNI有什麼關系

NDK:Android NDK 是在SDK前面又加上了「原生」二字,即Native Development Kit,因此又被Google稱為「NDK」。
NDK全稱:Native Development Kit。
NDK是一系列工具的集合。
* NDK提供了一系列的工具,幫助開發者快速開發C(或C++)的動態庫,並能自動將so和java應用一起打包成apk。這些工具對開發者的幫助是巨大的。
* NDK集成了交叉編譯器,並提供了相應的mk文件隔離CPU、平台、ABI等差異,開發人員只需要簡單修改mk文件(指出「哪些文件需要編譯」、「編譯特性要求」等),就可以創建出so。
* NDK可以自動地將so和Java應用一起打包,極大地減輕了開發人員的打包工作。
其實:
NDK就是能夠方便快捷開發.so文件的工具。JNI的過程比較復雜,生成.so需要大量操作,而NDK就是簡化了這個過程。

Android SDK:
SDK (software development kit)軟體開發工具包。被軟體開發工程師用於為特定的軟體包、軟體框架、硬體平台、操作系統等建立應用軟體的開發工具的集合。因此!Android SDk 指的既是Android專屬的軟體開發工具包

JNI:
Java Native Interface (JNI)標準是java平台的一部分,它允許Java代碼和其他語言寫的代碼進行交互。JNI 是本地編程介面,它使得在 Java 虛擬機 (VM) 內部運行的 Java 代碼能夠與用其它編程語言(如 C、C++ 和匯編語言)編寫的應用程序和庫進行交互操作
當然一般需要進行如下操作流程:
1) 編寫java程序:這里以HelloWorld為例。為了實現在 java代碼中調用c函數printf。
代碼1:
class HelloWorld {
public native void testHelloWorld();
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
new HelloWorld().testHelloWorld();
}
}
聲明native方法:如果你想將一個方法做為一個本地方法的話,那麼你就必須聲明改方法為native的,並且不能實現。
Load動態庫:System.loadLibrary("hello");
這里一般是以static塊進行載入的。同時需要注意的是System.loadLibrary()的參數「hello」是動態庫的名字。
2) 編譯
javac HelloWorld.java
3) 生成擴展名為h的頭文件 javah ?
JNIEXPORT void JNICALL Java_HelloWorld_testHelloWorld (JNIEnv *, jobject);

這個h文件相當於我們在java裡面的介面,這里聲明了一個 Java_HelloWorld_testHelloWorld (JNIEnv *, jobject)方法,然後在我們 的本地方法裡面實現這個方法,也就是說我們在編寫C/C++程序的時候所使用的方法名必須和這里的一致)。
4) 編寫本地方法實現和由javah命令生成的頭文件裡面聲明的方法名相同的方法

代碼2:
#include "jni.h"
#include "HelloWorld.h"
#include other headers

JNIEXPORT void JNICALL Java_HelloWorld_testHelloWorld(JNIEnv *env, jobject obj)
{
printf("Hello world!/n");
return;
}
注意代碼2中的第1行,需要將jni.h(該文件可以在%JAVA_HOME%/include文件夾下面找到)文件引入,因為在程序中的JNIEnv、 jobject等類型都是在該頭文件中定義的;另外在第2行需要將HelloWorld.h頭文件引入。然後保存為 HelloWorldImpl.c就ok了。
5) 生成動態庫
這里以在Windows中為例,需要生成dll文件。在保存HelloWorldImpl.c文件夾下面,使用VC的編譯器cl成。 cl -I%java_home%/include -I%java_home%/include/win32 -LD HelloWorldImp.c -Fehello.dll 注意:生成的dll文件名在選項-Fe後面配置,這里是hello,因為在HelloWorld.java文件中我們loadLibary的時候使用的名字是hello。
另外需要將-I%java_home%/include -I%java_home%/include/win32參數加上,因為在第四步裡面編寫本地方法的時候引入了jni.h文件。

Ⅳ NDK下的two-libs例子與zlib,libpng一起編譯時出現連接不成功

樓主怎麼解決的?求告知

Ⅵ 怎麼解決android studio libpng error not a png file錯誤怎麼解決

Information:Gradle tasks [:app3:assembleDebug]
:app3:preBuild
:app3:compileDebugNdk UP-TO-DATE
:app3:preDebugBuild
:app3:checkDebugManifest
:app3:prepareDebugDependencies
:app3:compileDebugAidl UP-TO-DATE
:app3:compileDebugRenderscript UP-TO-DATE
:app3:generateDebugBuildConfig UP-TO-DATE
:app3:generateDebugAssets UP-TO-DATE
:app3:mergeDebugAssets UP-TO-DATE
:app3:generateDebugResValues UP-TO-DATE
:app3:generateDebugResources UP-TO-DATE
:app3:mergeDebugResources
:app3:mergeDebugResources FAILED
C:/Users/Administrator/AndroidStudioProjects/MyApplication3/app3/src/main/res/drawable-hdpi/Chrysanthemum.png
Error:Error: Invalid file name: must contain only lowercase letters and digits ([a-z0-9_.])
Error:Execution failed for task ':app3:mergeDebugResources'.
> C:/Users/Administrator/AndroidStudioProjects/MyApplication3/app3/src/main/res/drawable-hdpi/Chrysanthemum.png: Error: Invalid file name: must contain only lowercase letters and digits ([a-z0-9_.])
這時候是不是感覺很迷茫,出錯了對吧,下面就告訴你是怎麼回事,怎麼出錯的。
錯誤很簡單卻也很難發覺,原因就是在這張圖片上,為什麼是圖片上呢,剛開始的時候你的圖片是不是.jpg格式的,然而你把後綴名改成了.png的以為就可以了是吧,其實不是這樣,你只是把格式改成了.png,其實它還是.jpg格式的。要將圖片真正轉換成.png格式的才行。隨便找個圖片轉換工具就可以解決。

注意:在存放圖片時千萬不要將格式為.jpg的圖片改成.png格式,千萬不要偷懶,一定要將格式轉換成PNG格式的圖片,否則編譯將不通過。切記!!!!

Ⅶ 移植libpng庫怎麼連接使用

1.到libpng的官網上download自己相應的平台libpng的庫.然後解壓
2.查看makefile文件的內容。創建一個文件夾 查看makefile文件裡面編譯成庫必須包含的文件到該文件裡面在這里我文件名取名為png。
以下是libpng1510的makefile文件中比較全的說了包含所有編譯libpng庫需要的文件的語句。
OBJS = png.o pngset.o pngget.o pngrutil.o pngtrans.o pngwutil.o \
pngread.o pngrio.o pngwio.o pngwrite.o pngrtran.o \
pngwtran.o pngmem.o pngerror.o pngpread.o
(.o文件是編譯生成鏈接庫必要的中間文件)
3.1(這里有多種方法。3.1代表3步的第1種方法。)單獨編譯成so文件或.a文件(動態或靜態鏈接庫文件)然後移植到項目。該方法具體寫法可以參考ndk裡面docs文件夾下的ANDROID-MK.html的文檔。
3.1.1(3.1代表3步的第1種方法的第一步。):你可以建立一個jni文件夾然後把剛才的png文件夾扔到jni文件夾裡面然後再創建一個.mk文件。內容如下
靜態
LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE :=png
LOCAL_SRC_FILES := png/png.c png/pngset.c png/pngget.c png/pngrutil.c png/pngtrans.c png/pngwutil.c \
png/pngread.c png/pngrio.c png/pngwio.c png/pngwrite.c png/pngrtran.c \
png/pngwtran.c png/pngmem.c png/pngerror.c png/pngpread.c
include $(BUILD_STATIC_LIBRARY)
動態
LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE :=png
LOCAL_SRC_FILES := png/png.c png/pngset.c png/pngget.c png/pngrutil.c png/pngtrans.c png/pngwutil.c \
png/pngread.c png/pngrio.c png/pngwio.c png/pngwrite.c png/pngrtran.c \
png/pngwtran.c png/pngmem.c png/pngerror.c png/pngpread.c
include $(BUILD_SHARED_LIBRARY)
(當然你可以直接去掉把裡面的文件放在jni下面就不需要夾png/了)
3.1.2:如果你解壓好了ndk那麼把ndk的目錄加入環境變數之後那麼你就可以CD進入jni所在的上一層目錄。進行ndk-build了。這時候在你的新生成的libs和obj文件夾裡面就可以得到你想要的鏈接庫了。(如果你是用的是靜態的那麼libs文件夾裡面是不會有的。因為libs文件夾裡面的東西將來會直接打包到apk的。而靜態鏈接庫不會自動打包到裡面只能以動態庫打包進去。)
3.1.3:好了得到了鏈接庫之後你就可以到你的ndk項目裡面使用了!這時候你需要把你的動態鏈接庫直接復制到你的項目的jni文件夾下面。然後在裡面編寫以下這樣的類似的mk文件:
LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := png
LOCAL_SRC_FILES := libpng.so
#include $(BUILD_STATIC_LIBRARY) #如果是使用靜態的庫把這句include前的#去掉
#include $(BUILD_SHARED_LIBRARY) #如果是使用動態的庫把這句include前的#去掉

include $(CLEAR_VARS)
LOCAL_MODULE := ourproject
LOCAL_SRC_FILES := ourproject.c
#LOCAL_STATIC_LIBRARIES := libpng #如果是使用靜態的庫把這句include前的#去掉
#LOCAL_SHARED_LIBRARIES := libpng #如果是使用動態的庫把這句include前的#去掉
include $(BUILD_SHARED_LIBRARY)

編寫好之後你就可以CD到你項目路徑然後ndk-build了。在你的 ourproject.c
文件裡面試著寫一下png庫的調用。

Ⅷ 我在Android底層利用NDK使用OpenGL,但是好多函數都用不了,比如glColor3f這個函數,我該怎麼添加

glColor3f(1.0,1.0,1.0) glColor上顏色用的。3f表示3個浮點型參數 分別代表RGB三色。參數范圍在0.0~1.0間。

Ⅸ android ndk到底是什麼

NDK是一系列工具的集合。它提供了一系列的工具,幫助開發者快速開發C(或C++)的動態庫,並能自動將so和java應用一起打包成apk(AndroidPackage的縮寫,Android安裝包)。這些工具對開發者的幫助是巨大的。它集成了交叉編譯器,並提供了相應的mk文件隔離CPU、平台、ABI等差異,開發人員只需要簡單修改mk文件(指出「哪些文件需要編譯」、「編譯特性要求」等),就可以創建出so。它可以自動地將so和Java應用一起打包,極大地減輕了開發人員的打包工作。
NDK提供了一份穩定、功能有限的API頭文件聲明,Google明確聲明該API是穩定的,在後續所有版本中都穩定支持當前發布的API。從該版本的NDK中看出,這些API支持的功能非常有限,包含有:C標准庫(libc)、標准數學庫(libm)、壓縮庫(libz)、Log庫(liblog)。

Ⅹ android 中怎麼使用ndk

程序中一些邏輯是用C寫的,使用jni調用C代碼,使用基本的打log的方式很難查看大型數組,了解到android ndk sdk中有個工具叫ndk-gdb可以很方便地對c代碼進行調試,使用過程並不順利,遇到兩個錯誤,耗時一周終於解決。如果是在windows下,需要安裝cygwin。首先,在cygwin命令行下進入到你工程的根目錄下如果你要調試的程序已經在運行了,直接運行ndk-gdb
如果你要調試的程序沒有運行,可以使用ndk-gdb --start
鍵入ndk-gdb命令,會出現一系列庫文件載入的信息,這些庫可能會載入失敗,不過沒有關系
出現<gdb>提示符,輸入help命令可以查看一系列命令使用l命令列出c文件的內容,但是遇到 No symbol table is loaded. Use the "file" command.使用以下命令載入需要調試的so文件:
file obj/local/armeabi/libsearch-algorithm.so使用list或者l可以查看載入的c文件。使用b 100,在c文件的第100行設置斷點。
使用c或者continue命令繼續運行程序。
出現錯誤:Continuing.
Warning:Cannot insert breakpoint 1.
Error accessing memory address 0x11a0: Input/output error.錯誤原因:使用ndk-gdb --start 啟動程序第一個activity,但是此時so文件並沒有被載入。
解決方法:首先打開程序並使用,在保證so文件已經被使用的情況下,調用ndk-gdb命令調試程序進程。
正確流程:
1.創建一個模擬器或者使用真機運行想要調試的程序,確保so文件已經被載入。
2.在此程序的根目錄下調用ndk-gdb,出現gdb提示符。
3.使用l命令,應該可以列印出c文件。
4.使用b 10,可以在c文件的第十行列印斷點。
5.使用c命令恢復程序運行。

閱讀全文

與androidndklibpng相關的資料

熱點內容
單片機延時1秒 瀏覽:186
ctf如何加密 瀏覽:919
手機app怎麼安裝在智能電視使用 瀏覽:364
遠程桌面授權伺服器如何取消 瀏覽:897
程序員當司機的體驗 瀏覽:464
linuxoffice2016 瀏覽:672
小宇宙app怎麼付費 瀏覽:377
同花順上傳到伺服器地址 瀏覽:929
電腦加密安卓版 瀏覽:826
手機程序加密有什麼作用 瀏覽:178
求黑馬程序員python教程 瀏覽:528
androidmvvm優缺點 瀏覽:894
unix下編譯庫文件 瀏覽:633
程序員的u盤 瀏覽:237
android根據經緯度獲取城市 瀏覽:564
python使用解釋器還是編譯器 瀏覽:358
以下關於有加密演算法及密鑰描述 瀏覽:220
linuxgethostname 瀏覽:416
程序員多數有對象 瀏覽:131
單片機延時程序計算 瀏覽:444