Androidアプリを構築する際に「未定義の参照」エラーが発生します。私はJNIとNDKを使用しています。AndroidスタジオでNDKビルドの「未定義リファレンス」を解決するにはどうすればよいですか?
私にはわかりにくいのは、Androidアプリケーション自体のビルド中にNDKビルドを行っているようだということです。しかし、私は既にAndroid.mkとApplication.mkファイルをビルドして目的のライブラリを作成するためにコマンドラインを使用しました。 Androidアプリがしなければならないことは、ライブラリへのリンクであり、それを呼び出すことだけです。しかし、私がこれについて間違っていたとしても、なぜAILSuperFFT.oのエラーについて不平を言っているのか分かりません。このオブジェクトファイルは、すでに正常に構築されたライブラリの一部です。私のAndroidアプリのビルドプロセスでは、AILSuperFFT.cppやSuperpoweredライブラリへの内部呼び出しについて何も知りません。
Androidスタジオのコンソール出力は次のとおりです。
. . .
: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を使ってこのコードをビルドしてリンクするだけでなく、別のアプリで問題のないライブラリを使用することに注意してください。私はこれらの2つのアプリケーションの違いを教えてもらえませんが、ここでの依存関係に注意してください。Androidアプリは、Superpoweredのlibをビルドしてリンクする独自のライブラリを使用しています。アプリケーションは、ライブラリAによって公開されているインタフェースについてのみ知っています。これらのすべてが1つのアプリケーションで正常に動作します。 (私は、主なアプリケーションではできない特定の問題を実証するテストアプリを構築しています)。 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);
AILSuperFFT.oをビルドしました。今すぐリンクする必要がありますし、いくつかの部分が欠落しているように見えます。 'SuperpoweredFFTComplex'はどこに実装されていますか?この実装はリンクに含まれていますか?実装はAILSuperFFT.oをコンパイルできるプロトタイプと正確に一致していますか?この情報を追加してください。それがなければ、この質問に答えることはできません。 – user4581301
[定義されていない参照/未解決の外部シンボルエラーとは何ですか?それを修正するにはどうすればいいですか?](http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external-シンボルエラーとその対応方法) – user4581301
@ user4581301 - はい、実装がプロトタイプと一致しています。問題は、私の質問で示唆したように、ビルドプロセスは、ビルドしていたC++のソースファイルをコマンドラインを使ってライブラリにビルドしようとしていたことでした。回答が正しいと表示されています。ヘルプThx。 – Alyoshak