1

我有一个包含数百个 c++ 文件的大项目,我应该将它们移植到 Android。我也是该项目和 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”的配方失败

制作:* [obj/local/armeabi/libmylib.so] 错误 1

它现在甚至转到“SharedLibrary:libmylib.so”,但后来我得到了一堆这些错误“未定义的引用”,就像上面一样。包含类并定义了功能。

build-binary.mk 中的第 369 行是:

@$(调用主机-mkdir,$(dir $@))

但我不知道那是什么意思。我阅读了一些关于共享库权限问题的内容,并将所有文件设置为允许一切,但这并没有改变任何东西。会不会是 mkdir 由于某种原因失败了?有谁知道是什么问题?

任何帮助是极大的赞赏!

这是我的 Android.mk 文件:

LOCAL_PATH := $(调用我的目录)

包括 $(CLEAR_VARS)

LOCAL_MODULE := mylib

LOCAL_SRC_FILES := MyApp.cpp

LOCAL_CFLAGS := -D_Android_ -D_Debug_

包括 $(BUILD_SHARED_LIBRARY)

4

2 回答 2

0

可能正在发生以下三件事之一:

  • 您实际上并没有为这些函数编译代码,可能是因为它被#ifdef 包围,或者因为有问题的文件没有被构建。您可以检查是否存在与其源对应的 .o 文件。您还可以将#error 放在函数的主体中并验证那里的构建是否失败(我知道这听起来很愚蠢,但它会捕捉到浪费您时间的愚蠢错误)

  • 这些函数位于未链接的目标文件或库中。在这种情况下,您需要将缺少的部分添加到链接中。

  • 这些函数位于不同的动态库中,该动态库将在加载您正在构建的库之前预加载,或者至少会在加载依赖它们的函数之前加载。您可以使用一个特殊标志来允许共享库中未定义的符号 - 我忘记它是什么,但您可以查找它。

于 2012-07-12T03:13:52.460 回答
0

MyApp.cpp 中是否定义了 MyClass 类?

如果没有,您还需要在 LOCAL_SRC_FILES 中添加 MyClass 源文件,例如,

LOCAL_SRC_FILES := MyApp.cpp AClass.cpp。

于 2012-07-12T04:02:13.743 回答