導航:首頁 > 操作系統 > androidndk開發教程

androidndk開發教程

發布時間:2025-03-07 12:09:39

『壹』 「android NDK 」是什麼,在什麼情況下使用

Android 應用是在dalvik虛擬機中運行的。NDK可以讓你使用本地代碼語言來開發應用,比如說C/C++,這種方法對某些類型的應用的是有好處的,可以充分利用本地代碼和在某些情況下加速代碼的執行。
對於絕大多數的應用來說,使用NDK並不是一個明智的選擇,作為一個開發者,我們需要衡量它所帶來的好處和缺點。使用本地代碼並不一定可以使性能得到優化,但是通常使得應用代碼變得復雜。一般來說,我們將應用中關鍵部分的代碼用C/C++寫,而不能由於我們習慣於用C/C++開發而把所有的代碼都用C/C++來實現。
有下面這些特點的應用可以考慮使用NDK:
1 獨立的,不和其他應用有關系的
2 頻繁佔用CPU但是申請的內存空間不是很大的操作,像信號的處理,物體的模擬等等
簡單的用C/C++重寫我們的代碼是不會帶來很大的性能提升的。
在考慮是否採用本地代碼開發的時候,要結合應用的實際需求並且看看Android 的framework層是否提供了我們需要的API,但是用NDK可以充分利用本地已經有的代碼。
Android framework提供下面兩種方法來使用本地代碼:
1 在Android framework的框架下面開發應用,使用JNI的方法來使用NDK本地方法提供的API。這樣的好處就是我們可以很好的利用的Android的framework提供的框架,但是需要編寫本地具體實現的代碼。這樣的APK可以在Android 1.5及其之後的版本上面運行。
2 寫一個本地的Activity,在本地代碼中實現生命回調函數,AndroidSDk提供了
類,這個類可以方便的讓你在你的本地代碼中實現回調函數(OnCreate,OnPause),從而當這些事件發生的時候處理。

『貳』 如何用Android NDK編譯FFmpeg

Android內置的編解碼器實在太少,於是我們需要FFmpeg。Android提供了NDK,為我們使用FFmpeg這種C語言代碼提供了方便。
不過為了用NDK編譯FFmpeg,還真的花費了不少時間,也得到了很多人的幫助,最應該謝謝havlenapetr。我覺得我現在這些方法算是比較簡潔的了--
下面就盡量詳細的說一下我是怎麼在項目中使用FFmpeg的,但是基於我混亂的表達能力,有不明白的就問我。
你得了解JNI和Android NDK的基本用法,若覺得我的文章還不錯,可以看之前寫的JNI簡單入門和Android NDK入門
首先創建一個標準的Android項目vPlayer
android create project -n vPlayer -t 8 -p vPlayer -k me.abitno.vplayer -a PlayerView

然後在vPlayer目錄里
mkdir jni && cd jni
wget http //ffmpeg org/releases/ffmpeg-0.6.tar.bz2
tar xf ffmpeg-0.6.tar.bz2 && mv ffmpeg-0.6 ffmpeg && cd ffmpeg

在ffmpeg下新建一個config.sh,內容如下,注意把PREBUILT和PLATFORM設置正確。另外裡面有些參數你也可以自行調整,我主要是為了配置一個播放器而這樣設置的。
#!/bin/bash

PREBUILT=/home/abitno/Android/android-ndk-r4/build/prebuilt/linux-x86/arm-eabi-4.4.0
PLATFORM=/home/abitno/Android/android-ndk-r4/build/platforms/android-8/arch-arm

./configure --target-os=linux \
--arch=arm \
--enable-version3 \
--enable-gpl \
--enable-nonfree \
--disable-stripping \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffserver \
--disable-ffprobe \
--disable-encoders \
--disable-muxers \
--disable-devices \
--disable-protocols \
--enable-protocol=file \
--enable-avfilter \
--disable-network \
--disable-mpegaudio-hp \
--disable-avdevice \
--enable-cross-compile \
--cc=$PREBUILT/bin/arm-eabi-gcc \
--cross-prefix=$PREBUILT/bin/arm-eabi- \
--nm=$PREBUILT/bin/arm-eabi-nm \
--extra-cflags="-fPIC -DANDROID" \
--disable-asm \
--enable-neon \
--enable-armv5te \
--extra-ldflags="-Wl,-T,$PREBUILT/arm-eabi/lib/ldscripts/armelf.x -Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib $PREBUILT/lib/gcc/arm-eabi/4.4.0/crtbegin.o $PREBUILT/lib/gcc/arm-eabi/4.4.0/crtend.o -lc -lm -ldl"

運行config.sh開始configure
chmod +x config.sh
./config.sh

configure完成後,編輯剛剛生成的config.h,找到這句
#define restrict restrict

Android的GCC不支持restrict關鍵字,於是修改成下面這樣
#define restrict

編輯libavutil/libm.h,把其中的static方法都刪除。
分別修改libavcodec、libavfilter、libavformat、libavutil、libpostproc和libswscale下的Makefile,把下面兩句刪除
include $(SUBDIR)../subdir.mak
include $(SUBDIR)../config.mak

在ffmpeg下添加一個文件av.mk,內容如下
# LOCAL_PATH is one of libavutil, libavcodec, libavformat, or libswscale

#include $(LOCAL_PATH)/../config-$(TARGET_ARCH).mak
include $(LOCAL_PATH)/../config.mak

OBJS :=
OBJS-yes :=
MMX-OBJS-yes :=
include $(LOCAL_PATH)/Makefile

# collect objects
OBJS-$(HAVE_MMX) += $(MMX-OBJS-yes)
OBJS += $(OBJS-yes)

FFNAME := lib$(NAME)
FFLIBS := $(foreach,NAME,$(FFLIBS),lib$(NAME))
FFCFLAGS = -DHAVE_AV_CONFIG_H -Wno-sign-compare -Wno-switch -Wno-pointer-sign
FFCFLAGS += -DTARGET_CONFIG=\"config-$(TARGET_ARCH).h\"

ALL_S_FILES := $(wildcard $(LOCAL_PATH)/$(TARGET_ARCH)/*.S)
ALL_S_FILES := $(addprefix $(TARGET_ARCH)/, $(notdir $(ALL_S_FILES)))

ifneq ($(ALL_S_FILES),)
ALL_S_OBJS := $(patsubst %.S,%.o,$(ALL_S_FILES))
C_OBJS := $(filter-out $(ALL_S_OBJS),$(OBJS))
S_OBJS := $(filter $(ALL_S_OBJS),$(OBJS))
else
C_OBJS := $(OBJS)
S_OBJS :=
endif

C_FILES := $(patsubst %.o,%.c,$(C_OBJS))
S_FILES := $(patsubst %.o,%.S,$(S_OBJS))

FFFILES := $(sort $(S_FILES)) $(sort $(C_FILES))

接下來要添加一系列的Android.mk,在jni根目錄下的內容如下
include $(all-subdir-makefiles)

在ffmpeg目錄下,Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_STATIC_LIBRARIES := libavformat libavcodec libavutil libpostproc libswscale
LOCAL_MODULE := ffmpeg
include $(BUILD_SHARED_LIBRARY)
include $(call all-makefiles-under,$(LOCAL_PATH))

libavformat/Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(LOCAL_PATH)/../av.mk
LOCAL_SRC_FILES := $(FFFILES)
LOCAL_C_INCLUDES := \
$(LOCAL_PATH) \
$(LOCAL_PATH)/..
LOCAL_CFLAGS += $(FFCFLAGS)
LOCAL_CFLAGS += -include "string.h" -Dipv6mr_interface=ipv6mr_ifindex
LOCAL_LDLIBS := -lz
LOCAL_STATIC_LIBRARIES := $(FFLIBS)
LOCAL_MODULE := $(FFNAME)
include $(BUILD_STATIC_LIBRARY)

libavcodec/Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(LOCAL_PATH)/../av.mk
LOCAL_SRC_FILES := $(FFFILES)
LOCAL_C_INCLUDES := \
$(LOCAL_PATH) \
$(LOCAL_PATH)/..
LOCAL_CFLAGS += $(FFCFLAGS)
LOCAL_LDLIBS := -lz
LOCAL_STATIC_LIBRARIES := $(FFLIBS)
LOCAL_MODULE := $(FFNAME)
include $(BUILD_STATIC_LIBRARY)

libavfilter、libavutil、libpostproc和libswscale下的Android.mk內容如下
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(LOCAL_PATH)/../av.mk
LOCAL_SRC_FILES := $(FFFILES)
LOCAL_C_INCLUDES := \
$(LOCAL_PATH) \
$(LOCAL_PATH)/..
LOCAL_CFLAGS += $(FFCFLAGS)
LOCAL_STATIC_LIBRARIES := $(FFLIBS)
LOCAL_MODULE := $(FFNAME)
include $(BUILD_STATIC_LIBRARY)

最外層的jni/Android.mk和jni/ffmpeg/Android.mk我只是隨便這樣寫的,你應該根據自己的需求改寫。
最後運行ndk-build,經過漫長的等待就編譯完成了。至於具體怎麼應用可能以後會寫,我變得太懶了。。。
轉載,僅供參考,祝你愉快,滿意請採納。

閱讀全文

與androidndk開發教程相關的資料

熱點內容
色種和膠料配比演算法 瀏覽:758
為什麼大逃殺伺服器目前非常繁忙 瀏覽:619
企業個稅app怎麼設置密碼 瀏覽:223
程序員如何找游戲bug 瀏覽:368
mac如何卸載安卓系統 瀏覽:998
ase加密是什麼 瀏覽:326
php計劃任務框架 瀏覽:626
武夷山東站到武夷山源碼 瀏覽:270
54盜賊宏命令 瀏覽:493
怎樣將圖片壓縮一個文件夾 瀏覽:739
有損壓縮格式音頻視頻 瀏覽:262
如何將網站上傳到輕量伺服器centos 瀏覽:952
威海公交23路加密時間 瀏覽:956
成都軟體編程學校 瀏覽:779
app充電慢怎麼解決 瀏覽:915
哪些網站免費下載網站模板源碼 瀏覽:546
單片機led單燈一分鍾閃爍 瀏覽:363
long數據類型java 瀏覽:71
eclipsejava64下載 瀏覽:965
伺服器如何轉發消息的 瀏覽:885