【简介】
NDK 的音视频开发中,想调用 AudioTrack或Suerface的类和方法,而它们不属于NDK,而是Android SDK 框架里的部分。解决这个问题有两个方法:
1.在源码环境中将利用到AudioTrack或Suerface的项目作为Android SDK 框架的模块进行编译;
2.利用NDK的交叉编译工具,并且将Android SDK 源码中对应的头文件和库拷贝出来,包含到NDK的项目中;
【环境】
android-ndk-r7
【代码】
Android.mk
LOCAL_PATH:= $(call my-dir)
#-------------------[Rtsp]--------------------
include $(CLEAR_VARS)
LOCAL_MODULE := libRtsp
LOCAL_SRC_FILES := libRtsp.a
include $(PREBUILT_STATIC_LIBRARY)
#-------------------[NetIQ]--------------------
include $(CLEAR_VARS)
LOCAL_MODULE := libNetIQ
LOCAL_SRC_FILES := libNetIQ.a
include $(PREBUILT_STATIC_LIBRARY)
#-------------------[Dec264]--------------------
include $(CLEAR_VARS)
LOCAL_MODULE := libDEC264
LOCAL_SRC_FILES := libDEC264.a
include $(PREBUILT_STATIC_LIBRARY)
#-------------------[tmpc]--------------------
include $(CLEAR_VARS)
LOCAL_MODULE:= libtmpc
LOCAL_SRC_FILES:= \
tmpc/memory_manager.c \
tmpc/cc/yuv2rgb16tab.c \
...
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/android-8/include \
$(LOCAL_PATH)/tmpc/cc \
...
LOCAL_STATIC_LIBRARIES := \
libDEC264 \
libNetIQ \
libRtsp \
LOCAL_LDLIBS := -L$(LOCAL_PATH)/local_libs -llog -lsurfaceflinger_client -lmedia -lutils -lz
include $(BUILD_SHARED_LIBRARY)
Application.mk
# Build both ARMv5TE and ARMv7-A machine code.
APP_ABI := armeabi armeabi-v7a
TARGET_PLATFORM := android-8
【步骤】
省略。
【注意】
(1)java层调用库的方法
库命名规则:lib<something>.so
调用:
static {
System.loadLibrary("FileLoader");
}
(2)android命名空间
在Android源码中很多CPP的文件都有如下用法:
namespace android {
class AudioTrack
{...}
....
}
调用AudioTrack:
#include <media/AudioTrack.h>
using namespace android;
...
((AudioTrack*)p_droid->pAudioTrack)->write(p->pBuf, p_droid->nBufSize);
...
(3)使用静态库
如果NDK项目中需使用静态库,直接这样指定是没有效果的:LOCAL_STATIC_LIBRARIES:= libpcap,因为libpcap不是Android NDK默认自带的。
正确的做法是:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libpcap
LOCAL_SRC_FILES := libpcap.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := jnetpcap
LOCAL_SRC_FILES :=\
jnetpcap.cpp\
packet_flow.cpp\
packet_jheader.cpp\
jnetpcap_pcap_header.cpp\
nio_jbuffer.cpp\
winpcap_stat_ex.cpp\
winpcap_send_queue.cpp\
winpcap_ext.cpp\
jnetpcap_ids.cpp\
jnetpcap_dumper.cpp\
jnetpcap_utils.cpp\
util_in_cksum.cpp\
jnetpcap_beta.cpp\
nio_jmemory.cpp\
packet_jsmall_scanner.cpp\
packet_protocol.cpp\
nio_jnumber.cpp\
packet_jheader_scanner.cpp\
library.cpp\
packet_jscan.cpp\
jnetpcap_pcap100.cpp\
util_checksum.cpp\
packet_jpacket.cpp\
winpcap_ids.cpp\
jnetpcap_bpf.cpp
LOCAL_C_INCLUDES :=\
/home/sergio/android-ndk-r5b/platforms/android-8/arch-arm/usr/include\
/home/sergio/workspace/MyApp/jni/libpcap
LOCAL_STATIC_LIBRARIES := libpcap
include $(BUILD_SHARED_LIBRARY)
转贴:http://blog.csdn.net/stefzeus/article/details/7496810