1

Android に移植することになっている何百もの C++ ファイルを含む大きなプロジェクトがあります。私はプロジェクトとNDKも初めてです。ほとんどのエラーを取り除き、ndk ビルドはここまで進行します。

コンパイル++親指: mylib <= MyApp.cpp

共有ライブラリ: libmylib.so

./obj/local/armeabi/objs/mylib/MyApp.o: 関数内 `MyClass::MyFunction(unsigned long, void*, unsigned long long)':

C:\Development/./jni/AClass.h:249: 「MyClass::Function(unsigned long, void*, unsigned long long)」への未定義の参照

....ここにこれらのエラーメッセージがたくさんあります...

collect2: ld が 1 つの終了ステータスを返しました

/cygdrive/c/Android/android-ndk/android-ndk-r8/build/core/build-binary.mk:369: ターゲット `obj/local/armeabi/libmylib.so' のレシピが失敗しました

make: * [obj/local/armeabi/libmylib.so] エラー 1

「SharedLibrary : libmylib.so」にも移動しますが、上記のように「未定義の参照」というこれらのエラーのヒープが表示されます。クラスが含まれており、関数が定義されています。

build-binary.mk の 369 行目は次のとおりです。

@ $(call host-mkdir,$(dir $@))

しかし、それが何を意味するのかわかりません。共有ライブラリのアクセス許可の問題について何かを読み、すべてのファイルをすべて許可するように設定しましたが、何も変更されませんでした。何らかの理由で mkdir が失敗する可能性がありますか? 問題が何であるかを知っている人はいますか?

どんな助けでも大歓迎です!

ここに私の Android.mk ファイルがあります:

LOCAL_PATH := $(my-dir を呼び出す)

$(CLEAR_VARS) を含める

LOCAL_MODULE := mylib

LOCAL_SRC_FILES := MyApp.cpp

LOCAL_CFLAGS := -D_Android_ -D_Debug_

$(BUILD_SHARED_LIBRARY) を含める

4

2 に答える 2

0

Likely one of three things are happening:

  • You are not actually compiling the code for these functions, perhaps because it is surrounded by #ifdef or because the files in question are not being built. You can check for the presence of .o files corresponding to their source. You can also put #error in the body of the function and verify that the build fails there (I know it sounds silly, but it catches silly mistakes that waste your time)

  • The functions are in an object file or library that is not being linked in. In this case you need to add the missing piece to the linkage.

  • The functions are in a different dynamic library which will be preloaded before the library you are building is loaded, or at least will get loaded before the functions which depend on them are loaded. There is a special flag you can use to allow undefined symbols in shared libraries - I forget what it is, but you can look it up.

于 2012-07-12T03:13:52.460 に答える
0

クラス MyClass は MyApp.cpp で定義されていますか?

そうでない場合は、LOCAL_SRC_FILES にも MyClass ソース ファイルを追加する必要があります。たとえば、

LOCAL_SRC_FILES := MyApp.cpp AClass.cpp.

于 2012-07-12T04:02:13.743 に答える