AndroidStudio调用第三方so库

这篇具有很好参考价值的文章主要介绍了AndroidStudio调用第三方so库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

        最近公司设备换了新的触摸屏(为I2C接口),该触摸屏有个app,app中可以显示触摸屏固件的版本。我需要做的是在自己的app中读取到触摸屏固件版本。

        反编译了apk,得到了源码,发现对方app是通过jni调用so库的方式获取到的触摸屏固件版本。所以我可以从apk中拿到这个第三方so库,然后用我们自己的app去调用so库中的方法得到固件版本。这里记录一下在实现过程中遇到的问题和解决方案。

1.导入so库

        第三方so库的文件名为libegalaxapijni.so,将该文件放在libs目录下,如果没有该文件夹,需要手动创建。

android studio 调用第三方so库,android

        并在app的build.gradle中设置

android {
    ...
    defaultConfig {
        ...
        ndk {
            // 设置支持的SO库架构
            abiFilters 'armeabi-v7a'
        }
    }
}

2.调用jni方法

         创建一个工具类如图,用来调用jni方法

public class TouchScreenJNIUtil {
    // 加载库文件
    static {
        System.loadLibrary("egalaxapijni");
    }

    static native int getFWVersion(byte[] paramArrayOfbyte);

}
(1)找不到引用的so库问题解决方案1

        当我调用TouchScreenJNIUtil.getFWVersion()时报错

System.err: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.example.logdemo-2/base.apk"],nativeLibraryDirectories=[/data/app/com.example.logdemo-2/lib/arm, /vendor/lib, /system/lib]]] couldn't find "libegalaxapijni.so"

        这是由于找不到引用的so库导致的。 解决方法

android {
    ...
    defaultConfig {
        ...
        ndk {
            // 设置支持的SO库架构
            abiFilters 'armeabi-v7a'
        }
    }

    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
}
(1.1)找不到引用的so库问题解决方案2

        还有一种方法,将so库放到jniLibs文件夹中,如果没有此文件夹,需要手动创建,要注意与libs文件夹的目录位置是不同的。如用此方法不需要添加jniLibs.srcDirs = ['libs']

 android studio 调用第三方so库,android

         之后再次执行,报错解决,但是有新的报错

(2)so库版本与当前设备架构不一致问题解决方案
System.err: java.lang.UnsatisfiedLinkError: dlopen failed: "/data/app/com.example.logdemo-2/lib/arm/libegalaxapijni.so" is 64-bit instead of 32-bit

        这个错误是由于架构不同导致的,该so库是64位架构的,但是我们运行的设备是32位的,其实我们的设备是armeabi-v7a的,我们设备不支持这个so库。解压缩对方的apk,找到lib目录

android studio 调用第三方so库,android

android studio 调用第三方so库,android

        从armeabi-v7a中拿到so库,重新拷贝到项目的libs下。之后再次执行,报错解决,但是有新的报错

(3)调用so库的类的包名与so库规定的包名不一致问题解决方案
System.err: java.lang.UnsatisfiedLinkError: JNI_ERR returned from JNI_OnLoad in "/data/app/com.example.logdemo-1/lib/arm/libegalaxapijni.so"

        出现该错误可能是调用so库的类的包名与so库规定的包名不一致导致的。

        我们知道,使用jni时,需要在一个.cpp文件下实现java与cpp的转换,该文件中的方法名一般是包名+类名+方法名,例如

Java_cn_com_chioy_vptprocesstool_utils_JniClient_doProcess(JNIEnv *env, jclass clazz,
                                                           jdoubleArray raw_data,jint data_length,
                                                           jobject vpt_result) {

        这个.cpp文件目前就已经打包成so库了,so库已经指明了包名+类名+方法名,所以用我自己新创建的工具类TouchScreenJNIUtil.getFWVersion()去调用是肯定不行的。

        查看反编译源码,找到对方调用jni的java类

android studio 调用第三方so库,android

        可以看到,包名为com.eeti.android.egalaxsensortester,类名为Native,方法名为 static native int getFWVersion(byte[] paramArrayOfbyte);

        所以在我们自己的项目下建立相同的包名,并且创建相同类名的java文件,其中的方法名也要保持一致,这里就不做展示了。

android studio 调用第三方so库,android

        至此,可以成功调用第三方so库中的getFWVersion()方法。后面还遇到了其他问题,但通过查看源码也解决了,在这里就不再讨论了。文章来源地址https://www.toymoban.com/news/detail-859187.html

到了这里,关于AndroidStudio调用第三方so库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android Studio查看第三方库依赖树

    在Android开发过程中,我们或多或少都会引入第三方库,引入的库越多,越容易产生库之间的依赖冲突,所以我们今天一起来了解Android Studio查看第三方库依赖树。 下面就拿我遇到的问题还原一下: 之前接人容联客服系统的时候,集成完成后进入客服页面发生闪退,我们回顾

    2024年02月08日
    浏览(38)
  • Android Studio引用第三方库的方式

    title: 大小端详解 date: 2023-06-06 21:01:24 comments: true #是否可评论 toc: true #是否显示文章目录 categories: #分类 - gradle - android studio tags: #标签 - gradle - android studio summary: android stduio 导入第三方库方式 这里描述的第三方库文件格式指的是 so aar so库介绍一种方法 Aar介绍两种方法 libs目录

    2024年02月08日
    浏览(40)
  • Android Studio连接使用第三方模拟器

           使用Android Studio自带的模拟器,第一会比较卡,第二配置容易出错,第三,自带的模拟器很吃电脑配置。如果电脑配置较差,会比较耽误事。所以为例解决上面三个问题,可以在电脑上按照第三方手机模拟器,例如:夜神模拟器、雷电模拟器、MUMU模拟器等等,不管是

    2024年01月15日
    浏览(37)
  • 【Android Studio】第三方库 图表(MPAndroidChart)使用

    项目目录-app-build.gradle 项目目录-app-setting.gradle ​ 该类是图表的控件,类似于按键、图片,是从 xml 文件中通过 id 获取到的。 获取/创建 常用方法 方法名 描述 chart.setDrawBorders( boolean ) 是否显示图表边界,true:显示,默认 false chart.setScaleEnabled( boolean ) 是否使能缩放,true:使

    2024年02月06日
    浏览(42)
  • Android Studio 如何连接第三方模拟器(如:雷电、MuMu)

    一、基础软件信息: 1.Android Studio的版本信息:  2.第三方模拟器版本信息,以MuMu为例演示:  二、实操部分 1.同时打开AS 和 模拟器(mum),如图: 2.找到mum在电脑上的安装的径,然后在此路径下打开DOS窗口。具体的操作如下: a.在桌面上找到模拟器的启动图标; b.鼠标右键

    2024年02月15日
    浏览(33)
  • Android 13.0 添加自定义服务,并生成jar给第三方app调用

    在13.0系统产品定制化开发中,由于需要新增加自定义的功能,所以要增加自定义服务,而app上层通过调用自定义服务,来调用相应的功能,所以系统需要先生成jar,然后生成jar 给上层app调用,接下来就来分析实现的步骤,然后来实现相关的功能 从而来实现所需要的功能 添加

    2024年02月05日
    浏览(52)
  • Android 14.0 添加自定义服务,并生成jar给第三方app调用

    在14.0系统ROM产品定制化开发中,由于需要新增加自定义的功能,所以要增加自定义服务,而app上层通过调用自定义服务,来调用相应的功能,所以系统需要先生成jar,然后生成jar 给上层app调用,接下来就来分析实现的步骤,然后来实现相关的功能 从而来实现所需要的功能 在

    2024年04月10日
    浏览(37)
  • 鸿蒙使用第三方SO库

    使用第三方SO库以导入OpenCV和MNN的SO库为例 1、将MNN和Opencv的so文件(包括.407文件),放入模块下libs目录对应的版本(arm64-v8a和armeabi-v7a) 2、配置模块目录下的build-profile.json5的buildOption字段,增加abiFilters字段: 3、在CMakeLists.txt所在目录,创建\\\"thirdPart”目录,然后将MNN和opencv的头文件

    2024年01月19日
    浏览(25)
  • 鸿蒙加载第三方动态链接库(.so)文件

    在没有正确引用so文件情况下会报出上述错误,正确姿势应该如下 在Android的写法是在main目录下创建jniLibs,然后.so文件复制进去即可,但是在鸿蒙里面要在libs/内放置arm64-v8a和armeabi-v7a两个文件夹的so文件,然后在build.gradle文件 加多一个.so的描述 即可使用

    2024年02月13日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包