Android 如何调用c++;来自JNI的方法
在Java代码中: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
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)