我有一个包含数百个c ++文件的大项目,我应该将其移植到Android。我是该项目的新手,也是NDK的新手。我摆脱了大多数错误,并且ndk构建进展到这里:
Compile ++ thumb:mylib< = MyApp.cpp
SharedLibrary: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行是:
@ $(致电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)
答案 0 :(得分:0)
可能发生了三件事之一:
您实际上并没有编译这些函数的代码,可能是因为它被#ifdef包围,或者因为没有构建相关文件。您可以检查是否存在与其源对应的.o文件。你也可以把#error放在函数的主体中,并验证构建在那里失败(我知道它听起来很愚蠢,但它会捕获浪费时间的愚蠢错误)
这些函数位于未链接的目标文件或库中。在这种情况下,您需要将缺少的部分添加到链接中。
这些函数位于不同的动态库中,它将在您构建的库加载之前预先加载,或者至少在加载依赖它们的函数之前加载。有一个特殊的标志可以用来在共享库中允许未定义的符号 - 我忘了它是什么,但你可以查找它。
答案 1 :(得分:0)
MyApp.cpp中是否定义了MyClass类?
如果没有,您还需要在LOCAL_SRC_FILES中添加MyClass源文件,例如,
LOCAL_SRC_FILES:= MyApp.cpp AClass.cpp。