我有一个预先构建的.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文件,我该如何解决这个问题?
答案 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字符串的书。