在 JNI 文件夹中:
//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 中分离函数原型(prototype)和它们的实现?
更新:这是我的 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)
最佳答案
undefined reference 是由链接器输出的,而不是由编译器输出的。这意味着没有翻译单元包含您在代码中使用的功能。从 Android.mk 文件来看,我会说您的 LOCAL_SRC_FILES 语句中缺少 foo.cpp。
关于android - 无法在 JNI 中分离头文件和源文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17635795/