Opus 1.3.1 ndk-build issue in making .so library
Hello, I have followed this tutorial in compiling and using opus with NDK.
https://medium.com/rahasak/opus-codec-for-android-voip-application-7cfe7cd3dd9b
Its working fine with the opus version he is using but when I follow the same procedure step by step for Opus 1.3.1 , I have encountered following errors while using ndk-build command.
I am using Android Studio 3.4 NDK is android-ndk-r13b
Error occuring is:
E:/Projects/Android/opustest/app/src/main/obj/local/arm64-v8a/objs/senz/E_/Projects/Android/opustest/app/src/main/jni/opus/silk/NLSF2A.o: In function silk_NLSF2A': E:/Projects/Android/opustest/app/src/main/jni/opus/silk/NLSF2A.c:130: undefined reference to silk_LPC_fit'
E:/Projects/Android/opustest/app/src/main/obj/local/arm64-v8a/objs/senz/E_/Projects/Android/opustest/app/src/main/jni/opus/src/opus_decoder.o: In function opus_decoder_get_size': E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_decoder.c:112: undefined reference to celt_decoder_get_size'
E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_decoder.c:112: undefined reference to celt_decoder_get_size' E:/Projects/Android/opustest/app/src/main/obj/local/arm64-v8a/objs/senz/E_/Projects/Android/opustest/app/src/main/jni/opus/src/opus_decoder.o: In function opus_decoder_init':
E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_decoder.c:148: undefined reference to celt_decoder_init' E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_decoder.c:151: undefined reference to opus_custom_decoder_ctl'
E:/Projects/Android/opustest/app/src/main/obj/local/arm64-v8a/objs/senz/E_/Projects/Android/opustest/app/src/main/jni/opus/src/opus_decoder.o: In function opus_decoder_get_size': E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_decoder.c:112: undefined reference to celt_decoder_get_size'
E:/Projects/Android/opustest/app/src/main/obj/local/arm64-v8a/objs/senz/E_/Projects/Android/opustest/app/src/main/jni/opus/src/opus_decoder.o: In function opus_decode_frame': E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_decoder.c:491: undefined reference to opus_custom_decoder_ctl'
E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_decoder.c:493: undefined reference to opus_custom_decoder_ctl' E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_decoder.c:502: undefined reference to opus_custom_decoder_ctl'
E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_decoder.c:503: undefined reference to celt_decode_with_ec' E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_decoder.c:505: undefined reference to opus_custom_decoder_ctl'
E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_decoder.c:509: undefined reference to opus_custom_decoder_ctl' E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_decoder.c:531: undefined reference to opus_custom_decoder_ctl'
E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_decoder.c:532: undefined reference to celt_decode_with_ec' E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_decoder.c:516: undefined reference to opus_custom_decoder_ctl'
E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_decoder.c:518: undefined reference to celt_decode_with_ec' E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_decoder.c:549: undefined reference to opus_custom_decoder_ctl'
E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_decoder.c:556: undefined reference to opus_custom_decoder_ctl' E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_decoder.c:557: undefined reference to opus_custom_decoder_ctl'
E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_decoder.c:559: undefined reference to celt_decode_with_ec' E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_decoder.c:560: undefined reference to opus_custom_decoder_ctl'
E:/Projects/Android/opustest/app/src/main/obj/local/arm64-v8a/objs/senz/E_/Projects/Android/opustest/app/src/main/jni/opus/src/opus_decoder.o: In function opus_decoder_ctl': E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_decoder.c:874: undefined reference to opus_custom_decoder_ctl'
E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_decoder.c:940: undefined reference to opus_custom_decoder_ctl' E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_decoder.c:950: undefined reference to opus_custom_decoder_ctl'
E:/Projects/Android/opustest/app/src/main/obj/local/arm64-v8a/objs/senz/E_/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.o: In function opus_encoder_get_size': E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:178: undefined reference to celt_encoder_get_size'
E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:178: undefined reference to celt_encoder_get_size' E:/Projects/Android/opustest/app/src/main/obj/local/arm64-v8a/objs/senz/E_/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.o: In function opus_encoder_init':
E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:232: undefined reference to celt_encoder_init' E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:235: undefined reference to opus_custom_encoder_ctl'
E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:236: undefined reference to opus_custom_encoder_ctl' E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:266: undefined reference to tonality_analysis_init'
E:/Projects/Android/opustest/app/src/main/obj/local/arm64-v8a/objs/senz/E_/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.o: In function opus_encoder_get_size': E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:178: undefined reference to celt_encoder_get_size'
E:/Projects/Android/opustest/app/src/main/obj/local/arm64-v8a/objs/senz/E_/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.o: In function opus_encode_native': E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:1134: undefined reference to opus_custom_encoder_ctl'
E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:1155: undefined reference to tonality_analysis_reset' E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:1146: undefined reference to run_analysis'
E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:1549: undefined reference to opus_custom_encoder_ctl' E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:1906: undefined reference to opus_custom_encoder_ctl'
E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:1907: undefined reference to opus_custom_encoder_ctl' E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:1909: undefined reference to opus_custom_encoder_ctl'
E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:1913: undefined reference to opus_custom_encoder_ctl' E:/Projects/Android/opustest/app/src/main/obj/local/arm64-v8a/objs/senz/E_/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.o:E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:1917: more undefined references to opus_custom_encoder_ctl' follow
E:/Projects/Android/opustest/app/src/main/obj/local/arm64-v8a/objs/senz/E_/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.o: In function opus_encode_native': E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:2048: undefined reference to celt_encode_with_ec'E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:2054: undefined reference to opus_custom_encoder_ctl' E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:2055: undefined reference to opus_custom_encoder_ctl'
E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:2058: undefined reference to opus_custom_encoder_ctl' E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:2065: undefined reference to opus_custom_encoder_ctl'
E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:2068: undefined reference to celt_encode_with_ec'E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:2069: undefined reference to opus_custom_encoder_ctl'
E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:2076: undefined reference to opus_custom_encoder_ctl' E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:2077: undefined reference to opus_custom_encoder_ctl'
E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:2078: undefined reference to celt_encode_with_ec'E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:2102: undefined reference to opus_custom_encoder_ctl'
E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:2103: undefined reference to opus_custom_encoder_ctl' E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:2104: undefined reference to opus_custom_encoder_ctl'
E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:2105: undefined reference to opus_custom_encoder_ctl' E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:2106: undefined reference to opus_custom_encoder_ctl'
E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:2115: undefined reference to celt_encode_with_ec'E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:2117: undefined reference to celt_encode_with_ec'E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:2123: undefined reference to opus_custom_encoder_ctl' E:/Projects/Android/opustest/app/src/main/obj/local/arm64-v8a/objs/senz/E_/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.o: In function opus_encoder_ctl':
E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:2689: undefined reference to tonality_analysis_reset' E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:2695: undefined reference to opus_custom_encoder_ctl'
E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:2669: undefined reference to opus_custom_encoder_ctl' E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:2679: undefined reference to opus_custom_encoder_ctl'
E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:2765: undefined reference to opus_custom_encoder_ctl' E:/Projects/Android/opustest/app/src/main/jni/opus/src/opus_encoder.c:2720: undefined reference to opus_custom_encoder_ctl'
clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [E:/Projects/Android/opustest/app/src/main/obj/local/arm64-v8a/libsenz.so] Error 1
@Quadattack Did you manage to solve this?
@Quadattack Remove -DDISABLE_FLOAT_API and include OPUS_SOURCES += $(OPUS_SOURCES_FLOAT).
@ppamorim same case on my end.
I can understand the:
Remove -DDISABLE_FLOAT_API
But could you please elaborate on:
include OPUS_SOURCES += $(OPUS_SOURCES_FLOAT)
As OPUS_SOURCES_FLOAT, I couldn't find it.
It's not in the Android.mk file. It's imported externally. Please try to add this flag before its usage and compile.
@ppamorim my apologise, but I'm quite new in this thing.
Is there any way to get a rather detail step?
I mean,
it's imported externally
What does it mean? External in terms of what? Is there a command to do it? Or a code to add? And if it's a code, which file to be modified?
Please try to add this flag before its usage and compile.
What flag? What usage? and in which context is its usage? Compile? You mean gradle compile? Or ndk build compile? Or ./configure and make kinda thing?
So sorry, but I just don't simply understand your answer.
Further help is appreciated @ppamorim .
@fadils I think it's easier to share the script I am using to compile opus, it was "verified" by @mark4o.
Compile opus + libopusenc: https://gist.github.com/ppamorim/d6468fc4b8ba3ea2d17bef16b58ed72c
I've added comments explaining the changes needed to compile it.
Hey @ppamorim , thanks so much! For sure, the ndk-build was successfully executed.
However, two things:
I received this warning:
/app/src/main/jni/libopusenc/../: No such file or directory
Should I be worried about it?
I cannot also find the .so files after the ndk-build is executed.
You have to clone the source code of libopusenc inside a format of the same name, the script will find this folder and compile it.
To build .so you need to run this in the line 50 of the script above, you can move this to the end of the file and include libopusenc too:
include $(CLEAR_VARS)
LOCAL_MODULE := opus-share
# LOCAL_SRC_FILES := libopus.a
LOCAL_STATIC_LIBRARIES := opus
include $(BUILD_SHARED_LIBRARY)
Hey, thanks again.
Downloaded the libopusenc. Run ndk-build, still unsuccessful with the following:
make: *** No rule to make target
`/Users/fadils/voice-project/app/src/main/jni/libopusenc/
..//Users/fadils/voice-project/app/src/main/jni/libopusenc/src/ogg_packer.c',
needed by
`/Users/fadils/voice-project/app/src/main/obj/local/arm64-v8a/objs/opusenc/__//Users/fadils/voice-project/app/src/main/jni/libopusenc/src/ogg_packer.o'.
Stop.
Hello, Yeah i managed to solve it by careful analysis (updated files with respect to latest Opus files) of files included in Android.mk. Moreover, there are some C files which include demo in the name. Please exclude all those files from android.mk
@Quadattack Please close the issue if you sorted it.