Android:JNA实践(附Demo)
一、JNA和JNI的对比
2.什么是JNA?与JNI有什么差异?
(2)build.gradle 配置
apply plugin: 'com.android.library'
android {
......
sourceSets{
main{
jniLibs.srcDirs = ['src/main/jniLibs']
}
}
......
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
......
}
其中libnanovoice.so对于应的头文件(.h)内容如下:
#ifndef __JB_NANOSIC__H__
#define __JB_NANOSIC__H__ #ifdef __cplusplus
extern "C" {
#endif typedef void (*AppCallback) (char* data,int datalen); int nano_open(AppCallback cb);
int nano_close(void); #ifdef __cplusplus
}
#endif #endif
根据动态库提供的头文件里函数声明,编写JnaNanovoice.java 内容如下:
package com.lxl.nanosic.voice; import com.sun.jna.Callback;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.NativeLibrary;
import com.sun.jna.Pointer; public interface JnaNanovoice extends Library {
public static final String JNA_LIBRARY_NAME = "nanovoice";
public static final NativeLibrary JNA_NATIVE_LIB = NativeLibrary.getInstance(JnaNanovoice.JNA_LIBRARY_NAME);
public static final JnaNanovoice INSTANCE = (JnaNanovoice)Native.loadLibrary(JnaNanovoice.JNA_LIBRARY_NAME, JnaNanovoice.class); //直接加载第三方动态库 //定义接口AppCallback,继承自com.sun.jna.Callback
public interface AppCallback extends Callback {
void dataReceived(Pointer data, int datalen);
} //动态库的函数声明
int nano_open(AppCallback cb);
int nano_close();
}
c层和JNA层变量类型有所差异,需要转换:

推荐一个转换工具 :jnaeratorStudio.jar 使用方法:java -jar jnaeratorStudio.jar

(2)调用c库函数,其中Java回调接口需要进一步实现, NanoVoiceRecord.java 中JNA调用部分代码截取如下:
package com.lxl.nanosic.voice; import android.util.Log;
import com.sun.jna.Pointer;
import java.util.LinkedList; public class NanoVoiceRecord { private final String TAG = "NanoVoiceRecord";/**
* 回调函数
*/
private static JnaNanovoice.AppCallback mDataCallback; ...... /** API 2:开始录音 **/
public void start() {
......
// JNA接口
mDataCallback = new JnaNanovoice.AppCallback() {
// 实现接口中的回调
public void dataReceived (Pointer data, int datalen){
if(null != data){
byte[] buffer = data.getByteArray(0, datalen);
int res = OnDataReceived(buffer, datalen);
Log.w(TAG, "...OnDataReceived = " + res + "m_in_q.size=" + m_in_q.size());
} else {
Log.e(TAG, "...Callback data is null !!!");
}
}
};
// 开始录音并传入回调
JnaNanovoice.INSTANCE.nano_open(mDataCallback);
} /** API 3:停止录音 **/
public void stop()
{
JnaNanovoice.INSTANCE.nano_close(); //调用JNA接口退出录音
isRecording=false;
} ...... /**
* 处理c层回调上来的遥控器语音数据方法
*/
public int OnDataReceived(byte[] buffer, int size) {
byte[] bytes_pkg;
int bufferLength; if(m_in_q==null){
return 0;
} bytes_pkg = buffer.clone(); if (m_in_q.size() > 6) { //最多缓存6个包
m_in_q.removeFirst();
}
m_in_q.add(bytes_pkg); ......
}
至此便实现了Java层通过JNA对c层函数的直接调用:

Android:JNA实践(附Demo)的更多相关文章
- winserver的consul部署实践与.net core客户端使用(附demo源码)
winserver的consul部署实践与.net core客户端使用(附demo源码) 前言 随着微服务兴起,服务的管理显得极其重要.都知道微服务就是”拆“,把臃肿的单块应用,拆分成多个轻量级的 ...
- Android 浮动窗口进阶——画中画,浮动视频(附Demo)
今天继续上一篇Android顶层窗口.浮动窗口的进阶应用.上一篇主要讲解了WindowManager服务和如何使用WindowManager编写一个顶层窗口.今天主要是讲讲如何在顶层窗口里面播放视频, ...
- 开源分享:谷歌大佬联合打造《高级Kotlin强化实战(附Demo)》
Kotlin 以其简洁的特性而闻名,而在我们的实践中,更加简洁就意味着更加高效.事实上,在使用 Kotlin 的专业 Android 开发者中,有多达 67% 的人表示 Kotlin 已经帮助他们提升 ...
- fir.im Weekly - 2016 年 Android 最佳实践列表
2016 年已经过去一半,你在年初制定的成长计划都实现了吗? 学海无涯,技术成长不是一簇而就的事情.本期 fir.im Weekly 推荐 王下邀月熊_Chevalier的 我的编程之路--知识管理与 ...
- 学习笔记TF066:TensorFlow移动端应用,iOS、Android系统实践
TensorFlow对Android.iOS.树莓派都提供移动端支持. 移动端应用原理.移动端.嵌入式设备应用深度学习方式,一模型运行在云端服务器,向服务器发送请求,接收服务器响应:二在本地运行模型, ...
- Atitit.嵌入式web 服务器 java android最佳实践
Atitit.嵌入式web 服务器 java android最佳实践 1. Android4.4.21 2. 自己的webserver1 3. CyberHTTP for Java cybergar ...
- 基于socket的客户端和服务端聊天简单使用 附Demo
功能使用 服务端 分离一个不停接受客户端请求的线程 接受不客户端请求的线程中,再分离就收消息的线程 几大对象分别是 IPEndPoint IP终结点 服务端Socket,绑定终结点Bind,启动监听L ...
- Android最佳性能实践(三)——高性能编码优化
在前两篇文章当中,我们主要学习了Android内存方面的相关知识,包括如何合理地使用内存,以及当发生内存泄露时如何定位出问题的原因.那么关于内存的知识就讨论到这里,今天开始我们将学习一些性能编码优化的 ...
- Android最佳性能实践(二)——分析内存的使用情况
由于Android是为移动设备开发的操作系统,我们在开发应用程序的时候应当始终把内存问题充分考虑在内.虽然Android系统拥有垃圾自动回收机制,但这并不意味着我们就可以完全忽略何时去分配或释放内存. ...
随机推荐
- java程序启动极慢的问题处理
在程序部署过程中,遇到一次java程序启动极慢的情况 参考:https://www.iteye.com/blog/windshome-1836885 原部署环境是有外网的,启动java极快 后来极其修 ...
- Computer Vision_1_Active Appearance Models :Active Appearance Models——1998
此为计算机视觉部分,主要侧重在底层特征提取,视频分析,跟踪,目标检测和识别方面等方面. 1. Active Appearance Models 活动表观模型和活动轮廓模型基本思想来源 Snake,现在 ...
- GitHub新手使用篇
如何使用GitHub 未完结 目录: ISSUE总汇总: Issue1:GitHub的注册和使用? 答:(1)注册GitHub :https://github.com/.需要填用户名.邮箱.密码,值得 ...
- GOLANG的继承+接口语法练习
继承与接口同时存在 在Golang语言中,可以这么说:接口是继承的功能补充! 武当派有一个徒弟结构体,它继承WuDangMaster结构体的字段及方法 武林之中还有一个泰山北斗,名约少林派,少林入门神 ...
- Centos7下搭建WebGoat 8和DVWA环境
搭建WebGoat 安装前置条件说明 我们这里选择WebGoat的jar版本,由于WebGoat 8的jar文件已自带了tomcat和数据库,所以不需要再另外安装tomcat和mysql这种东西,只需 ...
- Mysql中用exists代替in
exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当 exists里的条件语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前loop到的 ...
- BZOJ 3932: [CQOI2015]任务查询系统 (主席树板题)
就是裸的主席树,差分之后排序插入主席树就行了. 注意主席树查询的时候叶子节点要特判,因为本身是有size的 还有要开longlong CODE #include <cctype> #inc ...
- Codeforces Round #588 (Div. 2) B. Ania and Minimizing(构造)
链接: https://codeforces.com/contest/1230/problem/B 题意: Ania has a large integer S. Its decimal repres ...
- SQL基础练习03---牛客网
目录 1 创建一个actor表 2 批量插入数据 3 批量插入数据不用replace 4 创建一个actor_name表 5 对first_name创建唯一索引 6 针对actor表创建视图actor ...
- Educational Codeforces Round 33 (Rated for Div. 2) A题
A. Chess For Three Alex, Bob and Carl will soon participate in a team chess tournament. Since they a ...