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

C Android NDK-如何调用另一个预构建库,c,android-ndk,java-native-interface,ndk-build,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> js

我有一个预构建的.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);
}
#包括
jstringjava\u com\u示例\u getBoo(JNIEnv*env,jobject this,jstringx)
{
返回foo.getBoo(x);
}

显然,它没有引用libfoo.so文件,我如何修复它?

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);
}
#包括
外部内部getBoo(内部);
jint Java\u com\u示例\u getBoo(JNIEnv*env,jobject this,jint x)
{
返回getBoo(x);
}
我希望您知道从
libfoo.so
导出的函数的名称。无论如何,NDK中有nm命令(
NDK\toolschains\arm-linux-androideabi-4.8\prebuilded\windows-x86\u 64\bin\arm-linux-androideabi nm.exe
)。用
-D
运行它,您就有了这个列表。通常,我们使用库附带的头文件来提供转发声明


我看到您最初的示例打算接受string参数并返回string。这增加了另一个层次的复杂性,请阅读一本关于JNI如何处理Java字符串的JNI书籍。

一个简单的方法是让您的Java代码先加载另一个库。很好,但是如何在C中调用函数?始终为我返回“未知类型名称foo”,您不需要“foo.”前缀。链接器将发现
getBoo()
在该库中实现。您需要在C代码中声明函数,请参阅更新(注释格式不允许代码示例)。