1

在 Java 代码中:

System.loadLibrary("twolib-second");

int  z = add(1, 2);

public native int add(int  x, int  y);

第一个.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);
}

安卓.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/用户名/ndk/android-ndk-r9/toolchains/arm-linux-androideabi-4.6/prebuilt/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_com_example_jniexample_MainActivity_add:jni/second.c:26:

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

4

1 回答 1

2

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

我猜这是因为您的第一个文件编译为 cpp 而第二个文件编译为 c。不同之处在于名称修饰。您可以将 linux bin util 命令 nm 调用到静态库和目标文件以列出符号并查看 rob 是什么。我想你会在静态库中看到首先有一个损坏的功能符号;second.o 中 func 的未损坏符号

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

于 2013-10-10T12:03:01.267 回答