//File foo.h
#ifndef FOO_H_
#define FOO_H_
class Foo {
public:
Foo();
void Funny();
};
#endif /* FOO_H_ */
//File foo.cpp
#include "foo.h"
cv::string bar[1] = {"FOO"};
Foo::Foo() {
}
void Foo::Funny() {
}
然后,当我打电话时:
Foo foo;
foo.Funny();
ndk-build抱怨:
error: undefined reference to 'Foo::Foo()
error: undefined reference to 'Foo::Funny()
但是,如果我将函数实现放在头文件中,如下所示:
#ifndef FOO_H_
#define FOO_H_
class Foo {
public:
Foo();
void Funny();
};
Foo::Foo() {
}
void Foo::Funny() {
}
#endif /* FOO_H_ */
然后编译器愉快地编译我的代码。
我如何在JNI中分离函数原型及其实现?
更新:这是我的Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
OPENCV_LIB_TYPE:=STATIC
OPENCV_INSTALL_MODULES:=on
include ../../sdk/native/jni/OpenCV.mk
LOCAL_SRC_FILES := native.cpp
LOCAL_C_INCLUDES += $(LOCAL_PATH)
LOCAL_LDLIBS += -llog -ldl
LOCAL_MODULE := native
include $(BUILD_SHARED_LIBRARY)
答案 0 :(得分:1)
未定义的引用由链接器输出,而不是由编译器输出。这意味着没有包含您在代码中使用的功能的翻译单元。通过Android.mk文件告诉我说你的LOCAL_SRC_FILES语句中缺少foo.cpp。