Android NDK - 如何调用另一个预建库

时间:2014-08-01 20:59:27

标签: c android-ndk java-native-interface ndk-build

我有一个预先构建的.so文件,我的Android.mk是:

LOCAL_MODULE    := hello
LOCAL_SRC_FILES := libfoo.so hello.c
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
include $(BUILD_SHARED_LIBRARY)

现在,我想要的是如何构建hello.c,它调用一个函数(getBoo - 位于libfoo.so)文件

到目前为止我所拥有的是:

#include <jni.h>

jstring Java_com_example_getBoo( JNIEnv*  env,jobject  this,jstring x )
{
    return foo.getBoo(x);
}

显然,没有引用libfoo.so文件,我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

<强> Android.mk

LOCAL_PATH      := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := hello
LOCAL_SRC_FILES := hello.c
LOCAL_SHARED_LIBRARIES := foo_prebuilt
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := foo_prebuilt
LOCAL_SRC_FILES := libfoo.so
include $(PREBUILT_SHARED_LIBRARY)

不要忘记您的Java代码应该按正确的顺序加载这两个库:

System.loadLibrary("foo");
System.loadLibrary("hello");

您还需要函数声明来满足C编译器。

#include <jni.h>
extern int getBoo(int);

jint Java_com_example_getBoo(JNIEnv* env, jobject this, jint x)
{
    return getBoo(x);
}

我希望您知道libfoo.so中导出函数的名称。无论如何,NDK中有 nm 命令(ndk\toolchains\arm-linux-androideabi-4.8\prebuilt\windows-x86_64\bin\arm-linux-androideabi-nm.exe)。使用-D运行它,您就拥有此列表。通常,我们使用来自的头文件我们用来提供前向声明的库。

我看到你原来的例子打算采用字符串参数并返回字符串。这增加了另一层复杂性,请阅读JNI关于JNI如何处理Java字符串的书。