2011-04-12 53 views
1

你好,我有一个奇怪的问题。 我构建了一个简单的android应用程序,它使用ndk和JNI。 该应用程序对.cpp(debugTest.cpp)文件使用它将jni和另一个.c(javaEssentials.c)文件与它的头文件(javaEssentials.h)链接到java和C++文件。 当我在.cpp文件中包含.c文件(#include“javaEssentials.c”)时,编译时不报告错误。 当我在.cpp文件中包含头文件时,编译器会报告.c文件中函数的未定义引用错误。这是真正奇怪的问题,我不明白为什么会发生这种情况。 像往常一样,我有一个包含在.c文件中的头文件的声明。在android NDK中包含本地头文件时未定义的引用

我android.mk是:

# build file written to describe the C and C++ source files to the Android NDK 

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_MODULE := debugTest 
LOCAL_SRC_FILES := debugTest.cpp 

include $(BUILD_SHARED_LIBRARY) 

任何想法,为什么发生这种情况?

Thanx提前!

回答

0

您应该#include .h文件,而不是.c或.cpp。

0

添加到您的Android.mk文件:

LOCAL_C_INCLUDES := $(LOCAL_PATH)include_dir1 \ 
        $(LOCAL_PATH)include_dir2 \ 
        ... 

对于每一个地方有.h文件

+0

再次不工作......我应该在LOCAL_SRC_FILES中包含所有文件还是仅包含使用JNI接口的文件? – filippos 2011-04-13 09:46:27

5

您应该只包括头(或选择使用原型),让您的C文件编译目录。

编译完成后,您仍然会抱怨“未定义的methodName引用”错误。

这是因为C++编译器对cpp文件内的方法的命名空间进行编码。它不会为c文件中的方法(或者重要的是,用于方法调用)执行此操作。这意味着编译后的c文件不能自然地访问已编译的C++代码中的方法,即使源代码会提示这一点。

但是,您可以告诉编译器该方法将由“C”语言调用,因此它不会编码方法名称空间。您可以指示编译器通过修改您的CPP的方法看起来像这样做:

extern "C" int methodName() 
{ 
    return 1; 
} 

方法名()现在会从你的编译的C文件访问。

相关问题