0

我有一个预建的 .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 文件,我该如何解决这个问题?

4

1 回答 1

1

安卓.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 如何处理 Java 字符串的 JNI 书籍。

于 2014-08-01T21:27:20.083 回答