美文网首页我爱编程
JNI 开发引用第三方 so

JNI 开发引用第三方 so

作者: maintel | 来源:发表于2018-05-28 11:32 被阅读0次

概述

Android开发中有时会遇到使用JNI调用C/C++函数库的场景。一般这个时候都是使用NDKC/C++源代码编译出so文件,然后进行调用。但是有时候会遇到另外的情况:

我们在NDK项目中还要再引入其他第三方的SO库

这个时候该怎么编译呢?

通过使用动态函数库的调用方法,直接包含其头文件,便可以直接调用库中的类和方法。

具体使用过程可以分为两步:

  • 编写JNI文件包含第三方库的头文件。

  • 编写MK文件引入预编译库(即第三方库)。

举个例子

拿现在项目中遇到的一个具体情景:

现在手头有一个USB设备,要求实现在windowsAndroidLinux嵌入式三平台通用的USB驱动库,然后各个平台只用做小量修改即可使用。经过评估决定使用github上的一个开源项目libusb来实现,使用中需要通过JNI对已有的so库再做一层封装,所以这里使用上面说的方式来调用,如下。

编写JNI文件

在要编写的源文件目录下新建include文件夹,将要使用的函数所在的头文件放入其中,如:libusb.h。

在我们的源码中包含这个头文件

#include "include/libusb.h"

然后直接在需要使用的位置调用相应的函数即可:

JNIEXPORT void JNICALL Java_com_usbtest_UsbTest_libUsbInit
        (JNIEnv *env, jclass jobj) {
    if (libusb_init(NULL) < 0)
    {
        LOGD("VeinSensorBase::Open(): libusb_init() <0\n");
    }
}

编译MK文件

首先将第三方库作为预编译引入

LOCAL_PATH := $(call my-dir)  

include $(CLEAR_VARS)  
LOCAL_MODULE := usb_pre   
LOCAL_SRC_FILES := usb/libusb-1.0.so
LOCAL_EXPORT_C_INCLUDES := include           
include $(PREBUILT_SHARED_LIBRARY)


include $(CLEAR_VARS)  
LOCAL_MODULE    := test 
LOCAL_SRC_FILES := usb_test.c
LOCAL_SHARED_LIBRARIES := usb_pre
LOCAL_LDLIBS := -llog  
include $(BUILD_SHARED_LIBRARY)  

其中:

  • LOCAL_MODULE := usb_pre 给这个第三方库取一个名字,不需要与原来的名字相同。

  • LOCAL_SRC_FILES := usb/libusb-1.0.so 表示这个库的路径,是在MK文件的目录下的usb目录中。

  • LOCAL_EXPORT_C_INCLUDES := include 引用的第三方so库的头文件位置。

  • PREBUILT_SHARED_LIBRARY 表示这是一个共享库,即so库。

  • LOCAL_SHARED_LIBRARIES := usb_pre 这一步则表示此模块依赖于上面命名的预编译库。

然后执行ndk-build编译即可,此时在libs文件夹中会生成两个so文件,分别为libtest.solibusb-1.0.so,都拷贝到项目中就可以了。

相关文章

  • JNI 开发引用第三方 so

    概述 在Android开发中有时会遇到使用JNI调用C/C++函数库的场景。一般这个时候都是使用NDK将C/C++...

  • Android NDK开发之旅13--JNI--JNI引用

    Android NDK开发之旅 目录 JNI引用 JNI引用概念:引用变量。 引用类型:局部引用和全局引用(全局引...

  • JNI&NDK

    参考资料 Android Studio JNI开发入门教程android studio之jni(上)生成so文件编...

  • Golang开发动态库

    我们平时使用的动态库都是由C/C++开发最后生成的.so文件。可以先看看一个JNI的开发过程。 一. 开发JNI ...

  • NDK:02-调用第三方so文件

    NDK调用第三方so文件 说明:此处的so可以是jni生成的或者纯净的C语言的动态库.关于生成.so可参看我的上篇...

  • ldconfig的重要性

    刚刚在centos7下开发c程序,因为引用了第三方库,这个第三方库so文件安装在了/usr/local/lib/下...

  • AndroidStudio jni开发入门及打包so库和jar包

    AndroidStudio jni开发入门及打包so库和jar包 配置ndk开发环境 下载NDK,LLDB,CMa...

  • (三)JNI 引用、异常处理和缓存策略

    JNI 引用、异常处理和缓存策略 一、JNI 引用变量 1、引用类型 JNI 引用的类型分为局部引用和全局引用 2...

  • 使用CMake进行android NDK开发

    NDK与JNI就不多概述了,我所理解的NDK就是android开发中能够编译C/C++程序,构建SO,而JNI则是...

  • Android NDK小记

    AndroidStudio2.2开发NDK的正确姿势 Android JNI NDK C++ so本地验证 获取应...

网友评论

    本文标题:JNI 开发引用第三方 so

    本文链接:https://www.haomeiwen.com/subject/iiwwjftx.html