Пример Android ndk с ошибкой собственного звука

Я пытаюсь использовать пример кода для OpenSl ES, который включен в NDK в Android Studio. Это не сработало, как вы увидите позже. Поэтому мне нужна помощь в использовании кода в Android Studio. Код был написан для Eclipse, но для его включения я использовал функцию импорта из Android Studio. Я также пробовал Eclipse, и он работал нормально, но при попытке запустить код в Android Studio я получаю следующий код ошибки.

/home/flex/AndroidStudioProjects/native-audio1/app/src/main/jni/native-audio-jni.c
Error:(155) undefined reference to `slCreateEngine'
Error:(165) undefined reference to `SL_IID_ENGINE'
Error:(165) undefined reference to `SL_IID_ENGINE'
Error:(170) undefined reference to `SL_IID_ENVIRONMENTALREVERB'
Error:(170) undefined reference to `SL_IID_ENVIRONMENTALREVERB'
Error:(215) undefined reference to `SL_IID_BUFFERQUEUE'
Error:(215) undefined reference to `SL_IID_EFFECTSEND'
Error:(215) undefined reference to `SL_IID_VOLUME'
Error:(215) undefined reference to `SL_IID_BUFFERQUEUE'

...

collect2: error: ld returned 1 exit status
make: *** [/home/flex/AndroidStudioProjects/native-audio1/app/build/intermediates/ndk/debug/obj/local/arm64-v8a/libnative-audio-jni.so] Error 1
Error:Execution failed for task ':app:compileDebugNdk'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/home/flex/android-ndk-r10e/ndk-build'' finished with non-zero exit value 2
Information:BUILD FAILED
Information:Total time: 2.942 secs
Information:38 errors
Information:0 warnings
Information:See complete output in console

Что я сделал до сих пор: я изменил build.gradle (приложение) на

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "com.example.nativeaudio"
        minSdkVersion 19
        targetSdkVersion 19

        ndk {
            moduleName "native-audio-jni" //I included this one
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }

}

Далее я изменил local.properties на

sdk.dir=/home/flex/Android/Sdk
ndk.dir=/home/flex/android-ndk-r10e

Мой Android.mk выглядит так

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := native-audio-jni
LOCAL_SRC_FILES := native-audio-jni.c
# for native audio
LOCAL_LDLIBS    += -lOpenSLES
# for logging
LOCAL_LDLIBS    += -llog
# for native asset manager
LOCAL_LDLIBS    += -landroid

include $(BUILD_SHARED_LIBRARY)

мое приложение.mk:

APP_ABI := all

person user3393426    schedule 18.05.2015    source источник


Ответы (3)


Решение состояло в том, чтобы скомпилировать исходный код дважды.

Итак, в терминале я скомпилировал в первый раз с помощью команды: ndk-build
И во второй раз я использовал команду: ndk-build TARGET_PLATFORM=android-xy
xy необходимо заменить на версию для Android.

Это определенно не правильный способ, но, по крайней мере, он заставил его работать.

person user3393426    schedule 09.06.2015
comment
не могли бы вы уточнить свой ответ. Я ничего не мог понять из этого. - person Ansal Ali; 04.02.2016

Я думаю, вам просто нужно добавить

ldLibs.addAll(["OpenSLES"])

Внутри поля ndk{ } в файле build.gradle. Вот что решило проблему для меня.

person Steve B    schedule 29.04.2018

Я никогда не пробовал OpenSL ES на Android, но, возможно, вы могли бы попробовать изменить LOCAL_LDLIBS на (согласно этот сайт):

  • LOCAL_LDLIBS := libOpenSLES

Возможно, попробуйте также построить для каждой платформы шаг за шагом (не «все» в APP_ABI)

person brainsandwich    schedule 20.05.2015