Sta*_*ley 14 arm android-ndk opus
我正在尝试编译opus音频编解码器(http://www.opus-codec.org/downloads/)以用于Android应用程序.我正在使用Android NDK(第6版)来编译我的库.到目前为止,我必须为我的应用程序编译的本机C库非常简单,我已经能够将我的Android.mk文件基于jni主要基于教程或其他示例.但是,Opus的编辑看起来有点复杂.tar.gz存档包含一个用于编译Windows库的解决方案文件,它还包含一些用于标准Unix实现的Makefile,但是将这些文件转换为Android NDK使用的Android.mk makefile是一个挑战.
我已经搜索过,但一直无法找到Android makefile的在线版本来编译libopus.有人可能会将我链接到这样的makefile吗?或者,我可能会遗漏一些更简单的东西?是否有可能使用Automake或某种转换器为我生成Android.mk文件来自已包含在tar.gz中的unix makefile?
Sta*_*ley 12
以下是最终适合我的Android.mk makefile.我希望将来也可以帮助别人.请注意,在Opus Archive中包含的unix makefile中,是否使用固定或浮动丝源的决定被定义为"ifdef",而在这里我使用的是"fixed".(使用"float"很简单 - 只需将"silk/fixed"路径更新为指向"silk/float"并更新CFLAGS即可.
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
MY_MODULE_DIR := opus
LOCAL_MODULE := $(MY_MODULE_DIR)
LOCAL_SRC_FILES := \
$(subst $(ROOT_DIR)/$(MY_MODULE_DIR)/,,$(wildcard $(ROOT_DIR)/$(MY_MODULE_DIR)/src/*.c*)) \
$(subst $(ROOT_DIR)/$(MY_MODULE_DIR)/,,$(wildcard $(ROOT_DIR)/$(MY_MODULE_DIR)/celt/*.c*)) \
$(subst $(ROOT_DIR)/$(MY_MODULE_DIR)/,,$(wildcard $(ROOT_DIR)/$(MY_MODULE_DIR)/silk/*.c*)) \
$(subst $(ROOT_DIR)/$(MY_MODULE_DIR)/,,$(wildcard $(ROOT_DIR)/$(MY_MODULE_DIR)/silk/fixed/*.c*))
LOCAL_LDLIBS := -lm -llog
LOCAL_C_INCLUDES := \
$(ROOT_DIR)/$(MY_MODULE_DIR)/include \
$(ROOT_DIR)/$(MY_MODULE_DIR)/silk \
$(ROOT_DIR)/$(MY_MODULE_DIR)/silk/fixed \
$(ROOT_DIR)/$(MY_MODULE_DIR)/celt
LOCAL_CFLAGS := -DNULL=0 -DSOCKLEN_T=socklen_t -DLOCALE_NOT_USED -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64
LOCAL_CFLAGS += -Drestrict='' -D__EMX__ -DOPUS_BUILD -DFIXED_POINT -DUSE_ALLOCA -DHAVE_LRINT -DHAVE_LRINTF -O3 -fno-math-errno
LOCAL_CPPFLAGS := -DBSD=1
LOCAL_CPPFLAGS += -ffast-math -O3 -funroll-loops
include $(BUILD_STATIC_LIBRARY)
Run Code Online (Sandbox Code Playgroud)
gun*_*ess 11
重要编辑 图像可能不是最新的,但工作已在以下版本中进行了测试:
@ praneetloke解决方案的更新版本(适用于opus-1.1.2).一种不同的方法与一些额外的东西.首先下面是我要使用的结构(我打算使用更多的库,所以我把opus放在它自己的子文件夹中.)
其次,我Android.mk
在文件夹opus-1.1.2中有一个根文件和另一个.
这是根Android.mk
文件:
LOCAL_PATH := $(call my-dir)
OPUS_DIR := opus-1.1.2
include $(OPUS_DIR)/Android.mk
include $(CLEAR_VARS)
LOCAL_MODULE := codec
LOCAL_SRC_FILES := Opus_jni.cpp
LOCAL_CFLAGS := -DNULL=0
LOCAL_LDLIBS := -lm -llog
LOCAL_C_INCLUDES := $(LOCAL_PATH)/$(OPUS_DIR)/include
LOCAL_SHARED_LIBRARIES := opus
include $(BUILD_SHARED_LIBRARY)
Run Code Online (Sandbox Code Playgroud)
Android.mk
内部文件OPUS-1.1.2文件夹是:
#Backing up previous LOCAL_PATH so it does not screw with the root Android.mk file
LOCAL_PATH_OLD := $(LOCAL_PATH)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#include the .mk files
include $(LOCAL_PATH)/celt_sources.mk
include $(LOCAL_PATH)/silk_sources.mk
include $(LOCAL_PATH)/opus_sources.mk
LOCAL_MODULE := opus
#fixed point sources
SILK_SOURCES += $(SILK_SOURCES_FIXED)
#ARM build
CELT_SOURCES += $(CELT_SOURCES_ARM)
SILK_SOURCES += $(SILK_SOURCES_ARM)
LOCAL_SRC_FILES := \
$(CELT_SOURCES) $(SILK_SOURCES) $(OPUS_SOURCES)
LOCAL_LDLIBS := -lm -llog
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/include \
$(LOCAL_PATH)/silk \
$(LOCAL_PATH)/silk/fixed \
$(LOCAL_PATH)/celt
LOCAL_CFLAGS := -DNULL=0 -DSOCKLEN_T=socklen_t -DLOCALE_NOT_USED -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64
LOCAL_CFLAGS += -Drestrict='' -D__EMX__ -DOPUS_BUILD -DFIXED_POINT=1 -DDISABLE_FLOAT_API -DUSE_ALLOCA -DHAVE_LRINT -DHAVE_LRINTF -DAVOID_TABLES
LOCAL_CFLAGS += -w -std=gnu99 -O3 -fno-strict-aliasing -fprefetch-loop-arrays -fno-math-errno
LOCAL_CPPFLAGS := -DBSD=1
LOCAL_CPPFLAGS += -ffast-math -O3 -funroll-loops
include $(BUILD_SHARED_LIBRARY)
#Putting previous LOCAL_PATH back here
LOCAL_PATH := $(LOCAL_PATH_OLD)
Run Code Online (Sandbox Code Playgroud)
这就是它在opus-1.1.2文件夹中的样子:
对原始源的唯一触摸是添加Android.mk
文件.没有删除.
这样我就可以像使用单独的库一样使用和更新opus.
这是那些想要在android中编译和使用opus的人的附加内容; 包装来源,部分:
#include <jni.h>
#include <android/log.h>
#include <opus.h>
/* Header for class net_abcdefgh_opustrial_codec_Opus */
#ifndef _Included_net_abcdefgh_opustrial_codec_Opus
#define _Included_net_abcdefgh_opustrial_codec_Opus
#define TAG "Opus_JNI"
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG,__VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , TAG,__VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO , TAG,__VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN , TAG,__VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , TAG,__VA_ARGS__)
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT jint JNICALL Java_net_abcdefgh_opustrial_codec_Opus_open
(JNIEnv *env, jobject thiz){
...
return error;
}
JNIEXPORT jint JNICALL Java_net_abcdefgh_opustrial_codec_Opus_decode
(JNIEnv * env, jobject thiz, jbyteArray jencoded, jint jencodedOffset, jint jencodedLength, jbyteArray jpcm, jint jpcmOffset, jint jframeSize) {
...
return decodedSize;
}
JNIEXPORT jint JNICALL Java_net_abcdefgh_opustrial_codec_Opus_encode
(JNIEnv * env, jobject thiz, jbyteArray jpcm, jint jpcmOffset, jint jpcmLength, jbyteArray jencoded, jint jencodedOffset) {
...
return encodedSize;
}
JNIEXPORT void JNICALL Java_net_abcdefgh_opustrial_codec_Opus_close
(JNIEnv *env, jobject thiz){
...
}
#ifdef __cplusplus
}
#endif
#endif
Run Code Online (Sandbox Code Playgroud)
Application.mk
文件(可选)
APP_ABI := all # mips, armeabi, armeabi-v7a, x86 etc. builds
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
10813 次 |
最近记录: |