首页 > 其他分享 >Android使用JNA体会心得

Android使用JNA体会心得

时间:2023-12-26 11:03:14浏览次数:29  
标签:int jna UpdateStatus JNA so Android 心得 JNATest

JNA(Java Native Access)技术也许大家用的很少,其实他也是java官方支持的,并且在github上不断更新着。它主要用在你不需要去编写c++代码,而只是直接使用编译好的独立so库。假设我们编译了独立的so库,此时我们也没有别的需求,仅仅调用so库方法使用功能,就是最好的选择。

Android使用JNA体会心得_jar

1. JNA的使用需要依赖2个jar和一个so库

jna-min.jar

jna-platform.jar

libjnidispatch.so

https://github.com/java-native-access/jna/tree/5.14.0/dist,github官方下载

其中 libjnidispatch.so 是下载对应的arm解压出来的so, 比如从下载 android_aarch64.jar 中解压得到,其中aarch64表示 arm64-v8a平台


2. JNA使用介绍

假设我们编译了一个 libmyadd.so,其头文件如下

#ifndef MYADD_H
#define MYADD_H

#include <stdint.h>
// 如果使用JNA这里一定要extern "C", 否则函数名被重载
#ifdef __cplusplus
extern "C" {
    typedef void(*RequestCallback) (uint32_t iVal_ID, uint32_t _resp_data);
    
    int addh(int x, int y);
    int UpdateStatus(uint32_t iArray_ArraySize, uint32_t iArray_RouteIDList[3]);
    int RequestRegister(RequestCallback _cb);
}
#endif

#endif


然后我们使用JNA调用so里的方法,其声明方式如下:

// 注意包导入
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Callback;

interface JNATest extends Library {
    JNATest INSTANCE = (JNATest) Native.load("myadd", JNATest.class);
    public int addh(int x, int r);
    int UpdateStatus(int x, long[] routeidlist);
    int RequestRegister(RequestRegisterCallBack cb);
}

interface RequestRegisterCallBack extends Callback {
    void registerCallBack(int routeID, int _resp_data);
}

JNATest 演示了常用的3种用法,用法主要体现在参数上面,这里是最大的坑。初次使用时特别容易犯错。

我们看addh,UpdateStatus,RequestRegister 其实就对应了c++种头文件的函数。

1)这里面有两个核心的地方,即需要继承 Library 和 Callback。其中Callback用于带有so库中有回调方法时的使用。

2)我们可以看到 UpdateStatus 中的第二个参数用的是 long[],而不是ArrayList<Long>,JNA不支持使用ArrayList。

3)RequestRegister中的参数是接口类型,那么JNA在声明时,一定要 extends Callback。


2. JNA使用示例

通过以上的分析,那就把这3个函数调用试试

int c= JNATest.INSTANCE.addh(11,222);
long[] arr= new long[]{};
int c2= JNATest.INSTANCE.UpdateStatus(11, arr);
int c3= JNATest.INSTANCE.RequestRegister(new RequestRegisterCallBack() {

  @Override
    public void registerCallBack(int routeID, int _resp_data) {

  }
});
Log.e("MainActivity2", "JNA返回1:" + c);
Log.e("MainActivity2", "JNA返回2:" + c2);
Log.e("MainActivity2", "JNA返回3:" + c3);

调用其实也很简单,总的来说,JNA的使用比JNI方便多了,但是它只适合你不需要去编码C++的业务。

标签:int,jna,UpdateStatus,JNA,so,Android,心得,JNATest
From: https://blog.51cto.com/u_13719230/8980068

相关文章

  • Android 常用注解一览
    注解的使用有助于减少样板代码的编写,并提供了一种声明性的方法来描述代码的意图和行为。可以用于实现依赖注入,数据库映射、运行时权限处理等功能。 1.值约束类型注解@Nullable//变量、参数或返回值可能为null@NonNull//变量、参数或返回值不能为null@IntRange//......
  • 在Android应用开发中使用NFC功能
    NFC介绍NFC是指“近场通讯”(NearFieldCommunication),它是一种短距离无线通信技术,允许设备在非接触或极短距离内进行通信。NFC通常用于移动支付、门禁系统、智能标签和其他物联网应用中。Android系统对NFC提供了广泛的支持。通过NFC技术,Android设备可以与其他NFC设备进行通信,读取NF......
  • 解决Android sdk无法下载的问题
    android  SDK Manager下载:https://www.androiddevtools.cn/#android-sdk_r24.4.1-windows.zip 解压后有:SDKManager.exe(参考https://blog.csdn.net/m0_67695717/article/details/131918276) 由于android官网在国内无法正常访问,在安装androidsdk时经常会出现http://dl.......
  • Android 快速实现View的展开和收缩效果
    原文:Android快速实现View的展开和收缩效果-Stars-One的杂货小窝看到一篇文章用到了一个布局的属性animateLayoutChanges就能实现展开和收缩效果,特意记录一下效果代码<?xmlversion="1.0"encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayoutxml......
  • 关于Android studio新版本和NEW UI显示返回按钮的设置
    1.新版Androidstudio问题因为在新版本的AndroidStudio中,默认情况下是没有直接的选项来显示返回上一步按钮在状态栏上的,可以通过以下方法来实现返回上一步的功能:在AndroidStudio的顶部菜单栏中,选择"View"。在"View"菜单中,选择"Appearance"。在"Appearance"子菜单中,勾选"Toolbar"......
  • Android平台RTMP推送|轻量级RTSP服务能力封装代码实现
    好多开发者问我们,有没有针对Android平台RTMP直播推送、轻量级RTSP服务模块的进一步封装,可以更便捷的调用大牛直播SDK接口。为此,我们分享下我们针对Android平台SmartPublisher做的二次封装代码:packagecom.daniulive.smartpublisher;importandroid.util.Log;importjava.nio.By......
  • Android自定义View面试官最爱问的12个高级问题
    引言在Android开发领域,自定义View是一个考察开发者深度功底和创造力的重要方面。本文将从Android面试官的角度出发,深入探讨自定义View面试中常见的12个高级疑难问题,帮助大家更好地准备面试,展示专业技能。自定义View的基础知识问题:请解释自定义View的基本概念及其在Android开发中的......
  • 封神级 Android 音视频开发学习路线
    前言在日常生活中,视频类应用占据了我们越来越多的时间,各大公司也纷纷杀入这个战场,不管是抖音、快手等短视频类型,虎牙、斗鱼等直播类型,腾讯视频、爱奇艺、优酷等长视频类型,还是Vue、美拍等视频编辑美颜类型,总有一款适合你。随着5G普及以及网络资费的下降,音视频的前景是非常广阔的。......
  • 搞Android开发只要记住这几点,不要学得太杂太乱!
    前言作为Android程序员,选择学习什么样的技术?什么技术该不该学?去招聘网站上搜一搜、看看岗位要求就十分清楚了,自己具备的技术和能力,直接影响到你工作选择范围和能不能面试成功。如果想进大厂,那就需要在Android核心技术上面好好准备了,具体可以分下面几个模块来学习。学习模块1、基础......
  • Android实现雷达扫描效果
    手把手教程,先看效果,能用得上的再继续往下看……注:生成的gif图扫描有点慢,下面代码有参数可以控制速度。针对上图效果,以UI方不方便切图,可以有两种实现方式。方式一:UI将整个雷达切图(除中间头像外)针对整个雷达图做rotation动画完整代码:布局文件:activity_main.xml<?xmlversion="1.0"en......