如何使用Superpowered lib为NDK小于23构建应用程序?

时间:2016-05-22 10:10:05

标签: android c++ android-ndk build.gradle

我在这里建立了超级动力的示例应用: https://github.com/superpoweredSDK/Low-Latency-Android-Audio-iOS-Audio-Engine/blob/master/Android/CrossExample/

但是当我试图在手机上运行时(API16) - 我收到了这个错误:

01-14 12:53:51.906 7800-7800/? E/AndroidRuntime: FATAL EXCEPTION: main
                                             java.lang.ExceptionInInitializerError
                                                 at java.lang.Class.newInstanceImpl(Native Method)
                                                 at java.lang.Class.newInstance(Class.java:1319)
                                                 at android.app.Instrumentation.newActivity(Instrumentation.java:1068)
                                                 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2022)
                                                 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2132)
                                                 at android.app.ActivityThread.access$700(ActivityThread.java:140)
                                                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1238)
                                                 at android.os.Handler.dispatchMessage(Handler.java:99)
                                                 at android.os.Looper.loop(Looper.java:137)
                                                 at android.app.ActivityThread.main(ActivityThread.java:4918)
                                                 at java.lang.reflect.Method.invokeNative(Native Method)
                                                 at java.lang.reflect.Method.invoke(Method.java:511)
                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994)
                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761)
                                                 at dalvik.system.NativeStart.main(Native Method)
                                              Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1307]:   133 cannot locate 'strtof'...

                                                 at java.lang.Runtime.loadLibrary(Runtime.java:370)
                                                 at java.lang.System.loadLibrary(System.java:535)
                                                 at com.superpowered.crossexample.MainActivity.<clinit>(MainActivity.java:125)
                                                 at java.lang.Class.newInstanceImpl(Native Method) 
                                                 at java.lang.Class.newInstance(Class.java:1319) 
                                                 at android.app.Instrumentation.newActivity(Instrumentation.java:1068) 
                                                 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2022) 
                                                 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2132) 
                                                 at android.app.ActivityThread.access$700(ActivityThread.java:140) 
                                                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1238) 
                                                 at android.os.Handler.dispatchMessage(Handler.java:99) 
                                                 at android.os.Looper.loop(Looper.java:137) 
                                                 at android.app.ActivityThread.main(ActivityThread.java:4918) 
                                                 at java.lang.reflect.Method.invokeNative(Native Method) 
                                                 at java.lang.reflect.Method.invoke(Method.java:511) 
                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994) 
                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761) 
                                                 at dalvik.system.NativeStart.main(Native Method) 

我尝试将ndk版本更改为build:

  android.ndk {
        platformVersion = 15
}

在构建时出现此错误:

    /Volumes/iMect/iphone/SuperpoweredSource/decoder/SuperpoweredDecoder.cpp:549: error: undefined reference to 'strtof'
/Volumes/iMect/iphone/SuperpoweredSource/net/net.cpp:69: error: undefined reference to 'signal'
/Volumes/iMect/iphone/SuperpoweredSource/net/net.cpp:69: error: undefined reference to 'signal'
clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)

我还对gradle.build文件进行了更改,以便使用AndroidStudio 2.1进行构建

添加了行工具链“clang”,并添加了标志-fno-exceptions而不是-fexceptions

android.ndk {
        toolchain "clang"
      cppFlags.addAll(["-fno-exceptions", "-fsigned-char", "-I${superpowered_sdk_path}".toString()])

}

2 个答案:

答案 0 :(得分:3)

图书馆的更新已经发布! 使用superpoweredSDK的最新版本,一切都会好的。 Gabor Szanto说(How to build app with Superpowered lib for NDK less than 23?)它从16开始就很好,我在我的设备上进行了测试,编译并运行时没有任何错误。

答案 1 :(得分:1)

构建gradle中的android.ndk.platformVersion设置不会限制您的应用程序在旧设备上运行。它只是设置要构建的NDK版本。您可以安全地将其设置为23(Android 6.0 Marshmallow),您的应用程序仍将在使用旧版Android 的设备上运行。

android.defaultConfig.minSdkVersion.apiLevel设置确实设置了Android应用的下限,但它是Android SDK设置,与NDK无关。您可以将其设置为任何较低的值,低至11(NDK和OpenSL ES出现11)。我推荐19(4.4 KitKat),因为它是第一个具有适当音频调度的Android版本。今天75%的有源设备都与之兼容。