android下使用JNA

jna在windows和linux下使用都很简单只要导入jna.jar就可以,maven中如下引入就可以了

		<dependency>
			<groupId>net.java.dev.jnagroupId>
			<artifactId>jnaartifactId>
			<version>5.5.0version>
		dependency>

但是在android下要使用jna可就没这么简单了,因为jna.jar中没有android平台所需要动态库libjnidispatch.so,程序运行时会报如下的错误:

Caused by: java.lang.UnsatisfiedLinkError: Native library (com/sun/jna/android-arm/libjnidispatch.so) not found in resource path (.)

android下使用JNA_第1张图片
打开jna-5.5.0.jar,的确在jar包中找不到com/sun/jna/android-arm/这个文件夹
android下使用JNA_第2张图片于是我在google上找了一些关于android下使用jna的文章,找到了解决方案:
jna项目的确没有把android平台的动态库libjnidispatch.so打到jna.jar包(到少到目前最新的5.5.0版本都是如此,不明白为什么要这样)。但是它以附加jar包的形式额外提供了anndroid平台在不同硬件架构下的对应的动态库libjnidispatch.so.我们可以根据自己的项目的平台下载这些这些额外的动态库,加到自己的android项目就解决问题了。

具体怎么做呢?
首先要找到android平台的动态库libjnidispatch.so
去jna仓库的dist文件夹(以5.5.0版本为例): https://github.com/java-native-access/jna/tree/5.5.0/dist

如果你访问github较慢,也可以使用国内码云的仓库镜像(https://gitee.com/mirrors/jna/tree/5.5.0/dist)

如下图找到对应的平台的jar包(本文以常用的armv7平台为例)。下载这个jar包
android下使用JNA_第3张图片

下载指定平台jar包(以armv7为例)解开jar包就可以看到libjnidispatch.so就在里面:android下使用JNA_第4张图片
把它复制到你的android studio项目如下位置

${YOU_PROJECT_FOLDER}\app\src\main\jniLibs\armeabi-v7a\libjnidispatch.so

就可以了

参考资料

《Setting up JNA in Android Studio》
《Android开发如何使用JNA》

你可能感兴趣的:(java,android,jna,libjnidispatch)