java 也能直接操作硬件?(不通过*.c, *.cpp 等)

shenzhentom 2011-06-27 02:49:56
java 也能直接操作硬件?(不通过*.c, *.cpp 等)
卡内基梅隆的 sphinx 是用java写的语音识别程序。语音识别程序一般要和硬件有交互, 但sphinx包中却见不到*.c,*.cpp,*.dll,*.jni等格式文件. java 也能直接操作硬件? 这是怎么回事呢?
...全文
582 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
wenbodong 2011-06-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 death_spank 的回复:]
不用jni应该办不到的吧?就算是C/C++也是会用到汇编的,比如linux虽然大部分用C实现的,但是有些地方还是会用到汇编,汇编是一种低级语言,就是比电脑的二进制字节码高一个档次,所谓的低级语言就是为了比他更高级语言控制硬件而服务的
[/Quote]
8楼对C、C++及汇编的区别并没有搞清楚。其一,汇编不是什么比电脑的二进制代码高一个档次。无论是用汇编、C、C++写出来的程序,编译后当然都是编译成对应成某操作系统的可执行代码,或者是不依赖于操作系统的裸机代码。对于裸机代码,这个二进制代码,就是CPU的指令序列。而汇编,其实它就是这些指令的助记符。而C及C++,作为一个语言标准,又如何去编写裸机代码呢。当然是有人开发了相应的编译器,起到一个“翻译”的作用。将符合人类思维的高级语言程序转换成计算机指令序列。
shenzhentom 2011-06-28
  • 打赏
  • 举报
回复
我们原来是搞VC(C++)稍底层的, 想我理解一些.
wula0010 2011-06-28
  • 打赏
  • 举报
回复
这个直接操作和不直接操作,有区别么?能做你想做的事情就ok了,管它怎么做呢?这个就是封装,你只管接口,怎么调用就好了,管它封装在箱子里的是什么东西............
shenzhentom 2011-06-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wenbodong 的回复:]
GUI程序显示界面,绘图不是操作显卡吗,这不是硬件吗?文件操作,不是操作硬盘吗,这不是硬件吗?当然,并不是说直接操作它,也不是说高级语言就不能直接操作硬件。就说Windows程序,Windows应用程序是不能直接操作硬件的,只有运行在内核层的才可以,比如说驱动程序,C,C++,汇编都可以用来编写驱动程序,不是只能用汇编的。应用程序只用调用驱动即可。
而Java可没提供让你直接调用驱动的方法。这个……
[/Quote]

1)你的意思是:
Java的标准库就提供了一些方法, 这些标准库不光只是Java写的, 还有许多本地方法(C/C++实现的).

import java.io.*;
import javax.sound.sampled.AudioSystem;

等库中,应包含许多本地方法(C/C++实现的).

2) 看样子,编译生成这些包import java.io.*, 还很费事.
  • 打赏
  • 举报
回复
JNA_JNI
chenchenyangll 2011-06-28
  • 打赏
  • 举报
回复
6L说的中肯
KPRF2009 2011-06-28
  • 打赏
  • 举报
回复
想直接操作硬件,玩汇编/单机片吧。。。
Death_Spank 2011-06-28
  • 打赏
  • 举报
回复
不用jni应该办不到的吧?就算是C/C++也是会用到汇编的,比如linux虽然大部分用C实现的,但是有些地方还是会用到汇编,汇编是一种低级语言,就是比电脑的二进制字节码高一个档次,所谓的低级语言就是为了比他更高级语言控制硬件而服务的
grzrt 2011-06-28
  • 打赏
  • 举报
回复
学习了
wenbodong 2011-06-28
  • 打赏
  • 举报
回复
GUI程序显示界面,绘图不是操作显卡吗,这不是硬件吗?文件操作,不是操作硬盘吗,这不是硬件吗?当然,并不是说直接操作它,也不是说高级语言就不能直接操作硬件。就说Windows程序,Windows应用程序是不能直接操作硬件的,只有运行在内核层的才可以,比如说驱动程序,C,C++,汇编都可以用来编写驱动程序,不是只能用汇编的。应用程序只用调用驱动即可。
而Java可没提供让你直接调用驱动的方法。这个实现最终还是得去调用本地方法。如GUI,IO等等,这些的最底层,都是调用本地函数的。楼主所说的语音识别,不就是从声音的输入设备读取数据吗,Java的标准库就提供了一些方法。如下面一个程序,即时录音并输出。

import java.io.*;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.TargetDataLine;
public class RecordAndPlay {
volatile int divider;
public RecordAndPlay(){
Play();
}
public static void main(String[] args) {
new RecordAndPlay();
}
//播放音频文件
public void Play() {

try {
AudioFormat audioFormat =
// new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 44100F,
// 8, 1, 1, 44100F, false);
new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,44100F, 16, 2, 4,
44100F, true);
DataLine.Info info = new DataLine.Info(TargetDataLine.class,
audioFormat);
TargetDataLine targetDataLine = (TargetDataLine) AudioSystem.getLine(info);
targetDataLine.open(audioFormat);
SourceDataLine sourceDataLine;
info = new DataLine.Info(SourceDataLine.class, audioFormat);
sourceDataLine = (SourceDataLine) AudioSystem.getLine(info);
sourceDataLine.open(audioFormat);
targetDataLine.start();
sourceDataLine.start();
FloatControl fc=(FloatControl)sourceDataLine.getControl(FloatControl.Type.MASTER_GAIN);
double value=0.2;
float dB = (float)(Math.log(value==0.0?0.0001:value)/Math.log(10.0)*20.0);
fc.setValue(dB);
int nByte = 0;
final int bufSize=1024;
byte[] buffer = new byte[bufSize];
while (nByte != -1) {
//System.in.read();
nByte = targetDataLine.read(buffer, 0, bufSize);
sourceDataLine.write(buffer, 0, nByte);
}
sourceDataLine.stop();

} catch (Exception e) {
e.printStackTrace();
}
}
}
老紫竹 2011-06-28
  • 打赏
  • 举报
回复
比如硬件提供了基于java的开发包,或者提供了基于 xml的协议调用接口
老紫竹 2011-06-28
  • 打赏
  • 举报
回复
语音识别程序一般要和硬件有交互

如果硬件支持某种高级协议,那么何必直接操作硬件的端口,中断呢?
shenzhentom 2011-06-28
  • 打赏
  • 举报
回复

android上的应用也是java写的.

import android.speech.xxxx;
android.speech包源码中有以下:

----------------------------------------------------------------------------
System.loadLibrary("srec_jni"); //究竟是dll还是so, 由系统判断.

// AudioRecord JNI interface
// //对调用的方法做本地声明
private static native int AudioRecordNew(int sampleRate, int fifoDepth);
private static native int AudioRecordStart(int audioRecord);
----------------------------------------------------------------------------


请问,srec_jni 在系统什么目录(地方)可以找到?
Firebirds 2011-06-27
  • 打赏
  • 举报
回复
高级语言不可能直接操作硬件的吧
qybao 2011-06-27
  • 打赏
  • 举报
回复
不可能直接操作硬件
围观。。。
皮皮 2011-06-27
  • 打赏
  • 举报
回复
JNI

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧