无法在JNI中分隔标头和源文件

时间:2013-07-14 01:41:10

标签: android c++ android-ndk java-native-interface

<\ n>在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中分离函数原型及其实现?

更新:这是我的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)

1 个答案:

答案 0 :(得分:1)

未定义的引用由链接器输出,而不是由编译器输出。这意味着没有包含您在代码中使用的功能的翻译单元。通过Android.mk文件告诉我说你的LOCAL_SRC_FILES语句中缺少foo.cpp。