JNI 引用第三方 so

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011494285/article/details/80481470

概述

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

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

这个时候该怎么编译呢?

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

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

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

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

举个例子

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

现在手头有一个USB设备,公司要求实现在windowsAndroidLinux嵌入式三平台通用的USB驱动库,然后各个平台只用做小量修改即可使用。经过评估决定使用git上的一个开源项目libusb来实现,当然可以直接使用源码来编译一个so出来,但是这样不够B格,而且实际使用过程中还要引入另外一个库文件,所以这里使用上面说的方式来调用,如下。

编写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,都拷贝到项目中就可以了。

展开阅读全文

关于so读取第三方so路径的问题

08-19

最近在研究android 的 NATIVE-ACTIVITYrn按照 官司方文档用下面的Android.mk编译,读取两个第三方库。但是在虚拟机和真机上运行时都 出现了问题,rn错误为:java.lang.RuntimeException: Unable to start activity ComponentInfocom.androidMainFunctionHelperTesting/android.app.NativeActivity: java.lang.IllegalArgumentException: Unable to load native library: /data/app-lib/com.androidMainFunctionHelperTesting-2/libAndroidMainFunctionHelperTesting.sorn一直找不到错误原因。rn最后在/data/app-lib/直接进行libAndroidMainFunctionHelperTesting.so。显示错误:rncould not load libray"./obj/local/armeabi-v7a/libFramework.so ......rn为毛它会去读取obj/local/armeabi-v7a/的.so,这个文件被安装在 /data/app-lib/com.androidMainFunctionHelperTesting-2下,同libAndroidMainFunctionHelperTesting.so同一个路径。rnrnLOCAL_PATH := $(call my-dir)rnrninclude $(CLEAR_VARS)rnrnLOCAL_PATH := ./jnirnLOCAL_MODULE := PreFrameworkrnLOCAL_SRC_FILES := libFramework.sorninclude $(PREBUILT_SHARED_LIBRARY)rnrnLOCAL_PATH := $(call my-dir)rnrninclude $(CLEAR_VARS)rnrnLOCAL_PATH := ./jnirnLOCAL_MODULE := PreCoreToolsrnLOCAL_SRC_FILES := libCoreTools.sorninclude $(PREBUILT_SHARED_LIBRARY)rnrnLOCAL_PATH := $(call my-dir)rnrninclude $(CLEAR_VARS) rnrnLOCAL_PATH := ./jnirnrnLOCAL_MODULE := AndroidMainFunctionHelperTestingrn rnLOCAL_LDLIBS += -L$(AARM)\usr\librnLOCAL_LDLIBS += -L$(ANDK)\sources\cxx-stl\gnu-libstdc++\4.8\libs\armeabirnLOCAL_LDLIBS += -L$(ANDK)\sources\android\obj\local\armeabirnLOCAL_LDLIBS += -L$(BoostLib)rn rnLOCAL_LDLIBS += -landroid -llogrnrnLOCAL_STATIC_LIBRARIES := android_native_app_gluernLOCAL_SHARED_LIBRARIES += PreFrameworkrnLOCAL_SHARED_LIBRARIES += PreCoreToolsrnrnLOCAL_CFLAGS += -I$(BoostInclude) rnLOCAL_CFLAGS += -I$(CodeInclude) rnLOCAL_CFLAGS += -I$(HeadInclude)rnLOCAL_CFLAGS += -I$(ProgrammingInclude)rnLOCAL_CFLAGS += -I$(AARMTOOLS)\lib\gcc\arm-linux-androideabi\4.8\includernLOCAL_CFLAGS += -I$(AARM)\usr\includernLOCAL_CFLAGS += -I$(ANDK)\sources\cxx-stl\gnu-libstdc++\4.8\includernLOCAL_CFLAGS += -I$(ANDK)\sources\cxx-stl\gnu-libstdc++\4.8\libs\armeabi\includernLOCAL_CFLAGS += -I$(ANDK)\sources\android\support\includernLOCAL_CFLAGS += -I$(ANDK)\sources\android\native_app_gluernrnLOCAL_CFLAGS += -fexceptions -D___ANDROID___ -DANDROID rnLOCAL_CFLAGS += -DNDEBUG -DFRAMEWORK_NO_IMPORT -DCORE_TOOLS_NO_IMPORTrnLOCAL_CFLAGS += -Wall -Wextra -Wfatal-errorsrnLOCAL_CFLAGS += -Wswitch-default -Wmissing-include-dirsrnLOCAL_CFLAGS += -Wmissing-declarations -Wunreachable-codernLOCAL_CFLAGS += -Wfloat-equalrnLOCAL_CFLAGS += -Winit-selfrnLOCAL_CFLAGS += -Wno-unused-local-typedefsrnrnLOCAL_SRC_FILES += TestingLib.cpp \rn TestingMain.cpp \rn Testing/AndroidMainFunctionHelperTesting/TestingHelper.cpp rn rninclude $(BUILD_SHARED_LIBRARY)rnrn$(call import-module,android/native_app_glue) 论坛

没有更多推荐了,返回首页