Android NDK 混合 C 和 C++ 错误未定义对 mult(int, int) 的引用

Android NDK mixing C and C++ error undefined reference to mult(int, int)

本文关键字:int mult 引用 未定义 混合 NDK 错误 C++ Android      更新时间:2023-10-16

我有一个非常简单的CPP类和一个从我的CPP类调用的C函数。此外,我还使用 SWIG 在 JAVA 和本机之间生成粘合代码。

但是当我尝试使用 NDK 编译它时,如果编译失败并出现以下错误:

Android NDK: WARNING: APP_PLATFORM android-19 is larger than android:minSdkVersion 16 in ./AndroidManifest.xml    
[armeabi] Compile++ thumb: swig_module <= swig_wrap.cpp
[armeabi] Compile++ thumb: swig_module <= myclass.cpp
[armeabi] Compile thumb  : swig_module <= test.c
[armeabi] StaticLibrary  : libstdc++.a
[armeabi] SharedLibrary  : libswig_module.so
/Users/xxxxxxx/Documents/Android/adt-bundle-mac-x86_64-20131030/ndk/android-ndk-r9b/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/swig_module/src/myclass.o: in function myclass::foo():jni/src/myclass.cpp:6: error: undefined reference to 'mult(int, int)'
collect2: ld returned 1 exit status
make: *** [obj/local/armeabi/libswig_module.so] Error 1

所以这是代码:

**test.h**
int mult(int a, int b);
**test.c**
#include "test.h"
int mult(int a, int b)
{
    return a * b;
}
**myclass.h**
class myclass
{
public:
    int foo();
};
**myclass.cpp**
#include "myclass.h"
#include "test.h"
int myclass::foo()
{
    return mult(5,5);
}
**Android.mk**
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := swig_module 
LOCAL_SRC_FILES := swig_wrap.cpp src/myclass.cpp src/test.c
include $(BUILD_SHARED_LIBRARY)

swig_wrap.cpp文件是使用以下命令从 SWIG 生成的

swig -java -c++ -package com.example.swigtest.swiggen -outdir src/com/example/swigtest/swiggen/ -o jni/swig_wrap.cpp jni/swig.i
**swig.i**
%module swig_module
%{
    #include "src/myclass.h"
%}
%include "src/myclass.h" 

我可以使用 g++ 编译本机代码,没有问题,但使用 NDK 它不起作用。

我真的需要它来工作,因为我想使用 SWIG 控制器功能进行回调(我在这里不显示只是为了让事情尽可能简单)。

任何帮助,不胜感激。

您正在使用 C 编译器构建 test.c,C++代码看不到 C 函数,除非您添加extern "C"让C++链接器知道它是 C。

这样做:

test.h:
#ifdef __cplusplus
#define EXTERN extern "C"
#else
#define EXTERN 
#endif
EXTERN int mult(int a, int b);

另一种方法是将 extern "C" 与 .cpp 文件中的 #include 一起使用。出于与其他答案相同的原因。这样,当包含 C 头文件时,整个事情都包装在 extern "C" 中,因此所有函数都可以被C++识别。

制作你的 myclass.cpp 文件 :

#include "myclass.h"
*other c++ includes here*
extern "C" {
#include "test.h"
*other c includes here*
}