gpt4 book ai didi

c++ - 如何在 Android Studio 中为 NDK 构建解决 "undefined reference"?

转载 作者:行者123 更新时间:2023-11-30 01:43:15 27 4
gpt4 key购买 nike

我在构建我的 Android 应用程序时遇到“ undefined reference ”错误。我正在使用 JNI 和 NDK。

令我莫名其妙的是,它似乎在我构建 Android 应用程序本身的过程中进行了 NDK 构建。然而,我已经使用命令行来构建我的 Android.mk 和 Application.mk 文件以生成所需的库。 Android 应用程序应该做的就是链接到库并调用它。但即使我对此有误,我也不明白为什么它会提示 AILSuperFFT.o 中的错误。这个目标文件已经是我成功构建的库的一部分。我的 Android 应用程序的构建过程不应该知道任何有关 AILSuperFFT.cpp 或其对 Superpowered 库的内部调用的信息。

这是 Android Studio 中的控制台输出。

. . .
:app:compileDebugJavaWithJavac
:app:compileDebugJavaWithJavac - is not incremental (e.g. outputs have changed, no previous execution, etc.).
:app:compileDebugNdk
/Users/user1/Documents/AndroidStudioProjects/hello-jnicpp/app/build/intermediates/ndk/debug/obj/local/arm64-v8a/objs/hello-jni//Users/user1/Documents/AndroidStudioProjects/hello-jnicpp/app/src/main/jni/sources/AILSuperFFT.o: In function `CAILSuperFFT::LinearFFT_Quick(DSPSplitComplex*, int, int, int, FFTDirection, bool)':
/Users/user1/Documents/AndroidStudioProjects/hello-jnicpp/app/src/main/jni/sources/AILSuperFFT.cpp:139: undefined reference to `SuperpoweredFFTComplex(float*, float*, int, bool)'
/Users/user1/Documents/AndroidStudioProjects/hello-jnicpp/app/src/main/jni/sources/AILSuperFFT.cpp:139: undefined reference to `SuperpoweredFFTComplex(float*, float*, int, bool)'
/Users/user1/Documents/AndroidStudioProjects/hello-jnicpp/app/build/intermediates/ndk/debug/obj/local/arm64-v8a/objs/hello-jni//Users/user1/Documents/AndroidStudioProjects/hello-jnicpp/app/src/main/jni/sources/AILSuperFFT.o: In function `CAILSuperFFT::FFT2D(DSPSplitComplex*, int, int, FFTDirection)':
/Users/user1/Documents/AndroidStudioProjects/hello-jnicpp/app/src/main/jni/sources/AILSuperFFT.cpp:52: undefined reference to `__android_log_print'
collect2: error: ld returned 1 exit status
make: *** [/Users/user1/Documents/AndroidStudioProjects/hello-jnicpp/app/build/intermediates/ndk/debug/obj/local/arm64-v8a/libhello-jni.so] Error 1


FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:compileDebugNdk'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Users/user1/Documents/NDKDev/android-ndk-r10e/ndk-build'' finished with non-zero exit value 2

BUILD FAILED

消息窗口中的输出非常相似:

:app:incrementalDebugJavaCompilationSafeguard
:app:compileDebugJavaWithJavac
:app:compileDebugJavaWithJavac - is not incremental (e.g. outputs have changed, no previous execution, etc.).
:app:compileDebugNdk
/Users/user1/Documents/AndroidStudioProjects/hello-jnicpp/app/build/intermediates/ndk/debug/obj/local/arm64-v8a/objs/hello-jni//Users/user1/Documents/AndroidStudioProjects/hello-jnicpp/app/src/main/jni/sources/AILSuperFFT.o: In function `CAILSuperFFT::LinearFFT_Quick(DSPSplitComplex*, int, int, int, FFTDirection, bool)':
/Users/user1/Documents/AndroidStudioProjects/hello-jnicpp/app/build/intermediates/ndk/debug/obj/local/arm64-v8a/objs/hello-jni//Users/user1/Documents/AndroidStudioProjects/hello-jnicpp/app/src/main/jni/sources/AILSuperFFT.o: In function `CAILSuperFFT::FFT2D(DSPSplitComplex*, int, int, FFTDirection)':
/Users/user1/Documents/AndroidStudioProjects/hello-jnicpp/app/src/main/jni/sources/AILSuperFFT.cpp
Error:(139) undefined reference to `SuperpoweredFFTComplex(float*, float*, int, bool)'
Error:(139) undefined reference to `SuperpoweredFFTComplex(float*, float*, int, bool)'
Error:(52) undefined reference to `__android_log_print'
Error:error: ld returned 1 exit status
make: *** [/Users/user1/Documents/AndroidStudioProjects/hello-jnicpp/app/build/intermediates/ndk/debug/obj/local/arm64-v8a/libhello-jni.so] Error 1
Error:Execution failed for task ':app:compileDebugNdk'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Users/user1/Documents/NDKDev/android-ndk-r10e/ndk-build'' finished with non-zero exit value 2
Information:BUILD FAILED
Information:Total time: 5.858 secs
Information:5 errors

根据要求,下面是被投诉的源代码函数调用。请注意,不仅在 Mac 的终端中使用 ndk-build 可以很好地构建和链接此代码,而且随后可以在不同的应用程序中毫无问题地使用生成的库。我无法说出(目前)这两个应用程序之间的区别,但请注意这里的依赖关系:Android 应用程序使用我们的专有库,它在 Superpowered 库中构建和链接。该应用程序只知道库 A 公开的接口(interface),所有这些都在一个应用程序中运行良好。 (我正在构建一个测试应用程序来演示某个问题,这是主应用程序无法完成的)。 Log2() 返回一个 int。

    DSPSplitComplex data;

data.imagp=(float *) malloc(sizeof(float)*BUF_SIZE*BUF_SIZE);
data.realp=(float *) malloc(sizeof(float)*BUF_SIZE*BUF_SIZE);

. . . (some code)

DSPSplitComplex *pBuffer = &data;

SuperpoweredFFTComplex(&pBuffer->realp[0]), &(pBuffer->imagp[0]), Log2(length), (direction==kFFTDirection_Forward) ? true : false);

最佳答案

如果您有 JNI 文件并且没有通过将其添加到您的 build.gradle 中明确关闭自动构建,将尝试进行 ndk 构建:

android {
sourceSets.main {
jni.srcDirs = []
}
}

如果您在构建应用程序之前执行的 ndk-build 工作正常,原因很可能是 Gradle 调用的自动 ndk-build 忽略了您的 Android.mk 文件。

关于c++ - 如何在 Android Studio 中为 NDK 构建解决 "undefined reference"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38132490/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com