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

pdi*_*ddy 2 c c++ android swig android-ndk

我有一个非常简单的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
Run Code Online (Sandbox Code Playgroud)

所以这是代码:

**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)
Run Code Online (Sandbox Code Playgroud)

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

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" 
Run Code Online (Sandbox Code Playgroud)

我可以用g ++编译原生代码,没有任何问题,但使用NDK它无法正常工作.

我真的需要这个才能工作,因为我想使用SWIG导演功能进行回调(我这里没有展示,只是为了让事情尽可能简单).

任何帮助表示赞赏.

Fel*_*tti 5

您正在使用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);
Run Code Online (Sandbox Code Playgroud)