我们的应用需要调用第三方so中的方法,然后,第三方可以提供相应的SO文件和相应的头文件。
- SO文件:libFunction.so;
- 头文件:function.h,如下:
extern "C" {
......
int getResult(int index);
}
接下来就是如何使用这个SO和头文件function.h。
调用SO内方法
比如我们的源码文件为Test.cpp:
//引入第三方的头文件
#include "function.h"
int function(int index){
//调用第三方的方法
return getResult(index);
}
......
然后,我们就可以在java代码通过相应的JNII方法java调用JNI方法中调用这个function方法了。
或者可以添加上其他复杂的逻辑。
使用第三方SO
首先需要把第三方的SO文件放在我们工程目录中的某个文件夹内。
其实,在任意一个目录下都可以,可以是 app(module)/libs 、app/src/main/libs内,或者直接在app(module)内创建一个新的文件夹都可以,可以按照自己的想法来。
比如我们在app(module)内创建一个 .thirdpartlibs 文件夹,然后创建相应的CPU架构适配文件armeabi-v7a,第三方SO文件就放在这个文件夹内。
然后,我们就需要编写相应的Android.mk文件,将第三方SO文件编入我们新的SO文件内,如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# c每一个第三方的SO文件,都需要单独生成一个LOCAL_MODULE
LOCAL_MODULE := libFunction.so
# c找到第三方so的路径
LOCAL_SRC_FILES := ../../../.thirdpartlibs/$(TARGET_ARCH_ABI)/libFunction.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
# c生成的新的SO文件名称
LOCAL_MODULE := Test
# c源码文件
LOCAL_SRC_FILES += Test.cpp
# c新生成的SO需要编入的第三方SO
LOCAL_SHARED_LIBRARIES += libFunction.so
LOCAL_LDLIBS := -llog -landroid
NDK_APP_DST_DIR := ../libs/$(TARGET_ARCH_ABI)
include $(BUILD_SHARED_LIBRARY)
然后,就可以生成相应的新的libTest.so文件,然后在java代码中直接:
static
{
System.loadLibrary("Test");
}