xiph / opus

Modern audio compression for the internet.
https://opus-codec.org/
Other
2.28k stars 607 forks source link

Opus 1.3.1 ndk-build issue in making .so library #140

Open Khubaib96 opened 5 years ago

Khubaib96 commented 5 years ago

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 tosilk_LPCfit' 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 tocelt_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 functionopus_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 toopus_custom_decoderctl' 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 tocelt_decoder_getsize' 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 toopus_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 toopus_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 toopus_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 toopus_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 toopus_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 toopus_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 toopus_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 toopus_custom_decoderctl' 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 toopus_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 toopus_custom_decoderctl' 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 tocelt_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 functionopus_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 toopus_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 totonality_analysisinit' 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 tocelt_encoder_getsize' 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 toopus_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 torun_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 toopus_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 toopus_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 toopus_custom_encoderctl' 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 tocelt_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 toopus_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 toopus_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 toopus_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 toopus_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 toopus_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 toopus_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 toopus_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 tocelt_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 functionopus_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 toopus_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 toopus_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 toopus_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

ppamorim commented 5 years ago

@Quadattack Did you manage to solve this?

ppamorim commented 5 years ago

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

fadils commented 5 years ago

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

ppamorim commented 5 years ago

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

fadils commented 5 years ago

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

ppamorim commented 5 years ago

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

fadils commented 5 years ago

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.

ppamorim commented 5 years ago

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)
fadils commented 5 years ago

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.
Khubaib96 commented 5 years ago

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

ppamorim commented 5 years ago

@Quadattack Please close the issue if you sorted it.