如何从JNI调用c ++方法

时间:2013-10-10 11:45:54

标签: 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; }

first.h:

#ifndef FIRST_H
#define FIRST_H

extern int first(int  x, int  y);

#endif /* FIRST_H */

second.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);
}

Android.mk:

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)

我一直收到这个错误:

  

/home/username/ndk/android-ndk-r9/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin /../ LIB / GCC /臂-Linux的androideabi / 4.6 /。 ./../../../arm-linux-androideabi/bin/ld:./obj/local/armeabi/objs/twolib-second/second.o:in function Java_com_example_jniexample_MainActivity_add:jni / second.c:26 :

     

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

1 个答案:

答案 0 :(得分:2)

你需要使用extern“C”来包围first.h中的声明,以便首先从second.c调用func。

我想这是因为你的第一个文件被编译为cpp而第二个文件被编译为c。不同的是名称错误。你可以将linux bin util命令nm调用静态lib和目标文件来列出符号,然后看看rob是什么。我想你会在静态库中看到有一个错误的函数符号;在second.o

中的一个未编织的func符号

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