Android NDK将C模块与C ++应用程序链接

约翰·莱德格伦

这是我完整的Android.mk文件,当我尝试构建此文件时,出现链接器问题(请参阅下文)

LOCAL_PATH := $(call my-dir)

#
# Opus - low-latency audio codec
#

include $(CLEAR_VARS)
LOCAL_DIR := opus-1.0.3
LOCAL_MODULE := opus

LOCAL_CELT_SOURCES :=   \
    $(LOCAL_DIR)/celt/bands.c \
    ...

LOCAL_SILK_SOURCES :=   \
    $(LOCAL_DIR)/silk/CNG.c \
    ...

LOCAL_SILK_SOURCES_FIXED := \
    $(LOCAL_DIR)/silk/fixed/LTP_analysis_filter_FIX.c \
    ...

LOCAL_SILK_SOURCES_FLOAT := \
    $(LOCAL_DIR)/silk/float/apply_sine_window_FLP.c \
    ...

LOCAL_OPUS_SOURCES := \
    $(LOCAL_DIR)/src/opus.c \
    ...

LOCAL_CFLAGS := -DNONTHREADSAFE_PSEUDOSTACK

LOCAL_C_INCLUDES := \
    $(LOCAL_DIR)/include \
    $(LOCAL_DIR)/celt \
    $(LOCAL_DIR)/silk \
    $(LOCAL_DIR)/silk/fixed \
    $(LOCAL_DIR)/silk/float

LOCAL_SRC_FILES := $(LOCAL_CELT_SOURCES) \
    $(LOCAL_SILK_SOURCES) \
    $(LOCAL_SILK_SOURCES_FIXED) \
    $(LOCAL_SILK_SOURCES_FLOAT)

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_DIR)/include

include $(BUILD_STATIC_LIBRARY)

################

include $(CLEAR_VARS)

LOCAL_MODULE    := audio-client-jni

LOCAL_SRC_FILES := audio-client-jni.cpp

# low latency codec
LOCAL_STATIC_LIBRARIES += opus

# for native audio
LOCAL_LDLIBS    += -lOpenSLES

# for logging
LOCAL_LDLIBS    += -llog

# for native asset manager
LOCAL_LDLIBS    += -landroid

include $(BUILD_SHARED_LIBRARY)

为了排除opus的构建方式存在问题,我使用另一种名为tundra的构建系统进行了完全相同的操作,并且在使用MSVC ++的Windows上也可以正常编译。

这是链接器命令和错误(为了便于阅读,我对命令行进行了格式化)

C:/Projects/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/bin/arm-linux-androideabi-g++
    -Wl,-soname,libaudio-client-jni.so 
    -shared
    --sysroot=C:/Projects/android-ndk-r8e/platforms/android-14/arch-arm
    C:/Projects/workspace/AudioClient//obj/local/armeabi/objs/audio-client-jni/audio-client-jni.o
    C:/Projects/workspace/AudioClient//obj/local/armeabi/libopus.a
    C:/Projects/workspace/AudioClient//obj/local/armeabi/libstdc++.a
    -lgcc
    -no-canonical-prefixes
    -Wl,--no-undefined
    -Wl,-z,noexecstack
    -Wl,-z,relro
    -Wl,-z,now
    -LC:/Projects/android-ndk-r8e/platforms/android-14/arch-arm/usr/lib
    -lOpenSLES
    -llog
    -landroid
    -lstdc++
    -lc
    -lm
    -o C:/Projects/workspace/AudioClient//obj/local/armeabi/libaudio-client-jni.so

错误跟随

C:/Projects/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: C:/Projects/workspace/AudioClient//obj/local/armeabi/objs/audio-client-jni/audio-client-jni.o: in function (anonymous namespace)::AuClient::ReceiveThenEnqueue():C:/Projects/workspace/AudioClient//jni/audio-client-jni.cpp:419: error: undefined reference to 'opus_decode'
C:/Projects/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: C:/Projects/workspace/AudioClient//obj/local/armeabi/objs/audio-client-jni/audio-client-jni.o: in function InitializeThread:C:/Projects/workspace/AudioClient//jni/audio-client-jni.cpp:387: error: undefined reference to 'opus_decoder_create'

我需要第二眼,它audio-client-jni.o之前libopus.a是明确链接的但是如果这是问题,我不明白如何修改makefile以获得所需的结果。当包含在C ++应用程序中时,opus.h API用extern“ C”定义。到目前为止没有运气。

约翰·莱德格伦

感谢@AlexCohn的协助,显然没有任何问题,相反,所有源文件都未正确包含,在我看来这是个小小的忽略。

就我而言,我不确定应该如何设置才能运行bin util命令,幸运的是,它很简单:

"C:\Projects\android-ndk-r8e\toolchains\arm-linux-androideabi-4.6\prebuilt\windows-x86_64\bin\arm-linux-androideabi-nm.exe" "C:\Projects\workspace\AudioClient\obj\local\armeabi\libopus.a"

我只是从预构建的工具链中选择了看起来合理的东西。

利用nm的输出,我可以验证出口是否在那儿。经过仔细检查后,我发现我忘记了将它包含$(LOCAL_OPUS_SOURCES)在我的清单LOCAL_C_INCLUDES解决该问题,即可解决此问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用NDK将C ++应用程序移植到Android

来自分类Dev

安装应用程序时如何使用应用程序链接将参数传递给android playstore进行检索

来自分类Dev

如何将扩展程序链接到我的Android应用程序?

来自分类Dev

在flutter应用程序的android本机模块中使用mapbox导航api时资源链接失败

来自分类Dev

将服务器URL链接安全地存储在android应用程序中

来自分类Dev

以编程方式将Android应用程序与联系人/电话簿链接

来自分类Dev

如何退出android NDK应用程序

来自分类Dev

从应用程序打开android深度链接

来自分类Dev

Android应用程序的深层链接

来自分类Dev

Android应用程序中的深层链接

来自分类Dev

Android应用程序链接活动

来自分类Dev

从应用程序打开android深度链接

来自分类Dev

Android应用程序链接-在浏览器中从应用程序打开URL而不触发应用程序链接

来自分类Dev

将应用程序移植到android

来自分类Dev

Android:将功能推入应用程序

来自分类Dev

将应用程序移植到android

来自分类Dev

是否可以将Android NDK用于Android Wear应用程序?

来自分类Dev

在Android中使用NDK(C / C ++)将灰度效果应用于图像

来自分类Dev

将android应用程序嵌入到其他android应用程序中(覆盖+事件)

来自分类Dev

在我的Android NDK应用程序中添加libstagefright

来自分类Dev

使用Xamarin的NDK Android应用程序中的DllNotFoundException

来自分类Dev

使用ndk开发android应用程序时出错

来自分类Dev

如何在Android的我的应用程序中打开其他应用程序的链接

来自分类Dev

为什么android应用程序动态创建的“动态链接”不能直接打开应用程序?

来自分类Dev

Android:选择用于打开链接的应用程序

来自分类Dev

单击网站链接后如何打开Android应用程序?

来自分类Dev

如何处理Android应用程序的多个深度链接

来自分类Dev

谷歌应用程序引擎并链接到android项目

来自分类Dev

启动应用程序时,类XXX的android链接失败

Related 相关文章

  1. 1

    使用NDK将C ++应用程序移植到Android

  2. 2

    安装应用程序时如何使用应用程序链接将参数传递给android playstore进行检索

  3. 3

    如何将扩展程序链接到我的Android应用程序?

  4. 4

    在flutter应用程序的android本机模块中使用mapbox导航api时资源链接失败

  5. 5

    将服务器URL链接安全地存储在android应用程序中

  6. 6

    以编程方式将Android应用程序与联系人/电话簿链接

  7. 7

    如何退出android NDK应用程序

  8. 8

    从应用程序打开android深度链接

  9. 9

    Android应用程序的深层链接

  10. 10

    Android应用程序中的深层链接

  11. 11

    Android应用程序链接活动

  12. 12

    从应用程序打开android深度链接

  13. 13

    Android应用程序链接-在浏览器中从应用程序打开URL而不触发应用程序链接

  14. 14

    将应用程序移植到android

  15. 15

    Android:将功能推入应用程序

  16. 16

    将应用程序移植到android

  17. 17

    是否可以将Android NDK用于Android Wear应用程序?

  18. 18

    在Android中使用NDK(C / C ++)将灰度效果应用于图像

  19. 19

    将android应用程序嵌入到其他android应用程序中(覆盖+事件)

  20. 20

    在我的Android NDK应用程序中添加libstagefright

  21. 21

    使用Xamarin的NDK Android应用程序中的DllNotFoundException

  22. 22

    使用ndk开发android应用程序时出错

  23. 23

    如何在Android的我的应用程序中打开其他应用程序的链接

  24. 24

    为什么android应用程序动态创建的“动态链接”不能直接打开应用程序?

  25. 25

    Android:选择用于打开链接的应用程序

  26. 26

    单击网站链接后如何打开Android应用程序?

  27. 27

    如何处理Android应用程序的多个深度链接

  28. 28

    谷歌应用程序引擎并链接到android项目

  29. 29

    启动应用程序时,类XXX的android链接失败

热门标签

归档