android - 无法在 JNI 中分离头文件和源文件

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

在 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/

相关文章:

c++ - 使用 AVX 内在函数计算具有允许标量值 0、1 和 2 的 vector 的内积

c++ - 错误输入不在此范围内显示

ffmpeg - 使用 Android NDK r17 : undefined reference to '__mulodi4' 构建 C 库 (FFmpeg)

android - 在 Android 上构建 ffmpeg。使用 NEON (Tegra3) 和 Cygwin

Android 测试项目崩溃,错误 "Test run failed: Instrumentation run failed due to ' 进程崩溃 .'"

android - 如何在android中制作自定义拆分(底部)菜单

android - 在同一 Activity 中创建 ActionBar 和选项菜单

Android 操作系统内核相关查询

python - 如何在 C++ 中标记字符串(如 Python 中的 ply.lex)?

android - 如何在不使用 NDK 的情况下将 Android NDK 构建共享库添加到我的 APK?