假设我们有一个名为libname.a的特定预构建本机库。 我们需要从Java活动中调用本机库中包含的本机函数。这个例子存储在主头文件中:
DLLEXPORT int DLLCALL function(Xhandle handle, unsigned char *srcBuf, unsigned char *dstBuf);
其中Xhandle
是在头文件中定义的结构。
我们拥有的文件结构如下:
armv6
|- header1.h
|- header2.h
|- ...
|- libname.a
armv7
|- header1.h
|- header2.h
|- ...
|- libname.a
x86
|- header1.h
|- header2.h
|- ...
|- libname.a
我们需要将此库导入我们的Android项目。 我们做了什么:
我们的CMakeList.txt
文件(存储在项目根文件夹中):
cmake_minimum_required(VERSION 3.4.1)
add_library( name
STATIC # We guessed it's a static due to the .a extension
IMPORTED # No source code (.c or .cpp) available )
然后我们在jni目录中创建了一个Android.mk
文件:
LOCAL_PATH := $(call my-dir)
TARGET_ARCH_ABI := armv7
include $(CLEAR_VARS)
LOCAL_MODULE := name
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libname.a
LOCAL_EXPORT_C_INCLUDES := $(TARGET_ARCH_ABI)
include $(PREBUILT_STATIC_LIBRARY)
所有这些都是通过阅读以下链接推断出来的:
现在在我们的java活动中,我们知道我们需要添加如下内容:
public native int function();
// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("name");
}
我们觉得我们做错了什么,我们错过了什么。我们还必须定义参数,我们认为应该编写一个包装器。
所以任何帮助都会受到赞赏。
答案 0 :(得分:0)
Java类中的 function 本机方法需要
JNIEXPORT jstring JNICALL Java_my_package_name_MyClass_function(JNIEnv *env, jobject instance)
在C ++方面。您的 libname 不提供此类导出功能,因此您必须自行准备,如评论中所述Richard Critten。您可以将您的包装函数放在 Android.mk 旁边的 jniWrapper.cpp 文件中。
您的 Android.mk 可能看起来像
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := name
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libname.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/$(TARGET_ARCH_ABI)
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := jniWrapper
LOCAL_SRC_FILES := jniWrapper.cpp
LOCAL_STATIC_LIBRARIES := name
include $(BUILD_SHARD_LIBRARY)
最后, lodalLibrary()无法加载静态库; Java类的静态构造函数可能看起来像
static {
System.loadLibrary("jniWrapper");
}