This posting is for future reference, if I ever have to get OpenAL working again under Android's NDK. It will also be useful to my peer game developers who intend to do the same.
Step 1
Get an Android port of openal-soft.
Step 2
I like to build static libraries for android game dev, instead of dynamic ones. So I replaced the jni/Android.mk with my own:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) OPENAL_DIR := OpenAL AL_SOURCES := \ $(OPENAL_DIR)/Alc/android.c \ $(OPENAL_DIR)/OpenAL32/alAuxEffectSlot.c \ $(OPENAL_DIR)/OpenAL32/alBuffer.c \ $(OPENAL_DIR)/OpenAL32/alDatabuffer.c \ $(OPENAL_DIR)/OpenAL32/alEffect.c \ $(OPENAL_DIR)/OpenAL32/alError.c \ $(OPENAL_DIR)/OpenAL32/alExtension.c \ $(OPENAL_DIR)/OpenAL32/alFilter.c \ $(OPENAL_DIR)/OpenAL32/alListener.c \ $(OPENAL_DIR)/OpenAL32/alSource.c \ $(OPENAL_DIR)/OpenAL32/alState.c \ $(OPENAL_DIR)/OpenAL32/alThunk.c \ $(OPENAL_DIR)/Alc/ALc.c \ $(OPENAL_DIR)/Alc/alcConfig.c \ $(OPENAL_DIR)/Alc/alcEcho.c \ $(OPENAL_DIR)/Alc/alcModulator.c \ $(OPENAL_DIR)/Alc/alcReverb.c \ $(OPENAL_DIR)/Alc/alcRing.c \ $(OPENAL_DIR)/Alc/alcThread.c \ $(OPENAL_DIR)/Alc/ALu.c \ $(OPENAL_DIR)/Alc/bs2b.c \ $(OPENAL_DIR)/Alc/null.c \ $(OPENAL_DIR)/Alc/panning.c \ $(OPENAL_DIR)/Alc/mixer.c \ $(OPENAL_DIR)/Alc/audiotrack.c \ $(OPENAL_DIR)/Alc/opensles.c LOCAL_MODULE := openal LOCAL_SRC_FILES := $(AL_SOURCES) LOCAL_C_INCLUDES := \ $(HOME)/src/openal-soft/jni/OpenAL \ $(HOME)/src/openal-soft/jni/OpenAL/include \ $(HOME)/src/openal-soft/jni/OpenAL/OpenAL32/Include \ LOCAL_CFLAGS += \ -DAL_ALEXT_PROTOTYPES \ MAX_SOURCES_LOW ?= 4 MAX_SOURCES_START ?= 8 MAX_SOURCES_HIGH ?= 64 LOCAL_CFLAGS += -DMAX_SOURCES_LOW=$(MAX_SOURCES_LOW) -DMAX_SOURCES_START=$(MAX_SOURCES_START) -DMAX_SOURCES_HIGH=$(MAX_SOURCES_HIGH) LOCAL_CFLAGS += -DPOST_FROYO include $(BUILD_STATIC_LIBRARY)
Step 3
Get an Android port of freealut.
Step 4
Add an Android.mk file to src/ directory containing:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := alut LOCAL_SRC_FILES := \ alutBufferData.c \ alutCodec.c \ alutError.c \ alutInit.c \ alutInputStream.c \ alutLoader.c \ alutOutputStream.c \ alutUtil.c \ alutVersion.c \ alutWaveform.c LOCAL_C_INCLUDES := \ $(HOME)/src/freealut/include \ $(HOME)/src/openal-soft/jni/OpenAL/include \ #LOCAL_CFLAGS += include $(BUILD_STATIC_LIBRARY)
Step 5
Some config.h stuff does not properly make it into the source. Not sure why, so I manually edited alutInputStream.c alutInternal.h and alutUtil.c to overcome this.
Step 6
Now you can pull these static libraries into your build by adding to your project's Android.mk file something like this:
LOCAL_STATIC_LIBRARIES += alut openal ... $(call import-module,openal-soft/jni) $(call import-module,freealut/src)
UPDATE #1
When porting to MSWindows, I found that OpenAL is pretty tricky there as well. Some info for future reference:- You need to link against libOpenAL32.dll.a
- You need to supply soft_oal.dll with your game, renamed as OpenAL32.dll
- As with Android and OSX, the CMake stuff of freealut is horribly broken, so you need to pull in the sources to your project and hack around the platform specific stuff.