opus icon indicating copy to clipboard operation
opus copied to clipboard

Opus 1.3.1 ndk-build issue in making .so library

Open Khubaib96 opened this issue 6 years ago • 11 comments

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

Khubaib96 avatar Jul 16 '19 12:07 Khubaib96

@Quadattack Did you manage to solve this?

ppamorim avatar Aug 16 '19 15:08 ppamorim

@Quadattack Remove -DDISABLE_FLOAT_API and include OPUS_SOURCES += $(OPUS_SOURCES_FLOAT).

ppamorim avatar Aug 16 '19 16:08 ppamorim

@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.

fadils avatar Aug 22 '19 10:08 fadils

It's not in the Android.mk file. It's imported externally. Please try to add this flag before its usage and compile.

ppamorim avatar Aug 22 '19 12:08 ppamorim

@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 avatar Aug 22 '19 23:08 fadils

@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.

ppamorim avatar Aug 23 '19 10:08 ppamorim

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.

fadils avatar Aug 24 '19 02:08 fadils

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)

ppamorim avatar Aug 24 '19 20:08 ppamorim

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.

fadils avatar Aug 26 '19 03:08 fadils

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

Khubaib96 avatar Aug 26 '19 03:08 Khubaib96

@Quadattack Please close the issue if you sorted it.

ppamorim avatar Sep 05 '19 16:09 ppamorim