Android 如何调用c++;来自JNI的方法

Android 如何调用c++;来自JNI的方法,android,c++,c,android-ndk,java-native-interface,Android,C++,C,Android Ndk,Java Native Interface,在Java代码中: System.loadLibrary("twolib-second"); int z = add(1, 2); public native int add(int x, int y); first.cpp: #include "first.h" int first(int x, int y) { return x + y; } 第一,h: #ifndef FIRST_H #define FIRST_H extern int first(int

在Java代码中:

System.loadLibrary("twolib-second");

int  z = add(1, 2);

public native int add(int  x, int  y);
first.cpp:

#include "first.h"

int  first(int  x, int  y) {
    return x + y; }
第一,h:

#ifndef FIRST_H
#define FIRST_H

extern int first(int  x, int  y);

#endif /* FIRST_H */
第二,c:

#include "first.h"
#include <jni.h>

jint
Java_com_example_jniexample_MainActivity_add( JNIEnv*  env,
                                      jobject  this,
                                      jint     x,
                                      jint     y )
{
    return first(x, y);
}
我不断地发现这个错误:

/home/username/ndk/android-ndk-r9/toolschains/arm-linux-androideabi-4.6/prebuild/linux-x86_64/bin/。/lib/gcc/arm-linux-androideabi/4.6/。/../../../../../arm linux-androideabi/bin/ld:./obj/local/armeabi/objs/twolib second/second.o:函数中的Java\u com\u示例\u jniexample\u main活动\u add:jni/second.c:26:

错误:对“first”collect2的未定义引用:ld返回1退出状态make:[obj/local/armeabi/libtwolib second.so]错误1

为了从second.C调用func first,您需要使用extern“C”来包围first.h中的声明

我猜这是因为您的第一个文件被编译为cpp,而第二个文件被编译为c。不同之处在于名称mangling。您可以对静态库和对象文件调用linux bin util命令nm来列出符号并查看rob所在的wjere。我想你会在静态库中首先看到函数的一个破损符号;第二个.o中func的未混合符号


在使用ndk编程时,您将看到许多未定义的引用。LinuxBinUtils将是使生活更轻松的好工具

FixStand()应该在其原型中声明它的代码>外部“C”{} /Cuth.Bug,以避免名称的更改,如果您希望它可以从C调用,但也可能有其他的问题,比如“如何从C调用C++函数”。将为这个问题做一个更好的标题。你应该补充说,它应该是“C++”,C++,C.,C++。
LOCAL_PATH:= $(call my-dir)

# first lib, which will be built statically
#
include $(CLEAR_VARS)

LOCAL_MODULE    := libtwolib-first
LOCAL_SRC_FILES := first.cpp

include $(BUILD_STATIC_LIBRARY)

# second lib, which will depend on and include the first one
#
include $(CLEAR_VARS)

LOCAL_MODULE    := libtwolib-second
LOCAL_SRC_FILES := second.c

LOCAL_STATIC_LIBRARIES := libtwolib-first

include $(BUILD_SHARED_LIBRARY)