如何解决安卓工作室中NDK构建"undefined reference"问题?
How to solve "undefined reference" for NDK build in Android Studio?
我会收到一个"未定义的参考"错误构建我的Android应用程序。我正在使用JNI和NDK。
对我来说,莫名其妙的是,在我构建Android应用程序本身时,它似乎正在做NDK构建。但是,我已经使用了命令行来构建我的android.mk和application.mk文件来生成所需的库。所有的Android应用程序都应该做的就是链接到库并拨打库。但是,即使对此我错了,我也不明白为什么它在ailsuperfft.o中抱怨错误。这个对象文件已经是我成功构建的库的一部分。我的Android应用程序的构建过程不应了解ailsuperfft.cpp或其对超能力库的内部调用。
这是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应用程序使用我们的专有库,该库在超级能力的LIB中构建和链接。该应用只知道库A所曝光的接口,并且所有这些都可以在一个应用程序中工作。(我正在构建一个测试应用程序来演示某个问题,而主应用程序无法完成)。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-build:android {
sourceSets.main {
jni.srcDirs = []
}
}
如果您在构建应用程序之前进行的NDK构建工作正常工作,那么Gradle调用的自动化NDK构建的原因很可能会忽略您的android.mk文件。
相关文章:
- 如何使用ndk-build.cmd构建Android.so文件
- 对于哪些 ABI,我可以使用 NDK v10e 构建 apk?
- 我在 ndk 中构建文件时遇到错误 android.mk
- 指定 NDK 构建的目标架构
- NDK 构建中的异常"error: expected ';' after top level declarator"
- 为什么当我的项目是使用 Android NDK r16 构建时,我会收到来自 Android NDK r11 的错误消息
- '在使用安卓 NDK r10e 构建静态库时无效使用'auto'
- 我需要在 Android Studio 中构建 NDK. 但它返回一个错误
- 如何修复安卓工作室中的NDK构建错误
- Android NDK 中的预构建工具链和自定义工具链编译器之间的差异
- 如何将静态库链接到NDK Android构建中用作本机库的源
- Android NDK构建:指定C和C 的警告级别
- NDK - 包含一个预构建的库,并在 Android 项目中调用本机函数
- 我无法获得由 Clang 构建的优化 NDK 应用程序的调用堆栈
- 在Android NDK项目中使用webrtc-58 - 使用QT构建时"Undefined reference to CopyOnWriteBuffer"
- 如何禁用某些构建变体的Android NDK构建
- Android NDK:如何为ARM64-V8A构建最小值= 19
- 如何解决安卓工作室中NDK构建"undefined reference"问题?
- 在 Windows 上使用 Android ADT 构建 NDK 应用程序
- 将tess-two(Tesseract Tools for Android)库集成到Android工作室并构建ndk的问