java 也能直接操作硬件?(不通过*.c, *.cpp 等)
卡内基梅隆的 sphinx 是用java写的语音识别程序。语音识别程序一般要和硬件有交互, 但sphinx包中却见不到*.c,*.cpp,*.dll,*.jni等格式文件. java 也能直接操作硬件? 这是怎么回事呢?

解决方案 »

  1.   

    比如硬件提供了基于java的开发包,或者提供了基于 xml的协议调用接口
      

  2.   

    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();
            }
        }
    }
      

  3.   

    不用jni应该办不到的吧?就算是C/C++也是会用到汇编的,比如linux虽然大部分用C实现的,但是有些地方还是会用到汇编,汇编是一种低级语言,就是比电脑的二进制字节码高一个档次,所谓的低级语言就是为了比他更高级语言控制硬件而服务的
      

  4.   


    1)你的意思是:
    Java的标准库就提供了一些方法, 这些标准库不光只是Java写的, 还有许多本地方法(C/C++实现的).import java.io.*;
    import javax.sound.sampled.AudioSystem;等库中,应包含许多本地方法(C/C++实现的).2) 看样子,编译生成这些包import java.io.*, 还很费事.
      

  5.   

    我们原来是搞VC(C++)稍底层的, 想我理解一些.
      

  6.   

    8楼对C、C++及汇编的区别并没有搞清楚。其一,汇编不是什么比电脑的二进制代码高一个档次。无论是用汇编、C、C++写出来的程序,编译后当然都是编译成对应成某操作系统的可执行代码,或者是不依赖于操作系统的裸机代码。对于裸机代码,这个二进制代码,就是CPU的指令序列。而汇编,其实它就是这些指令的助记符。而C及C++,作为一个语言标准,又如何去编写裸机代码呢。当然是有人开发了相应的编译器,起到一个“翻译”的作用。将符合人类思维的高级语言程序转换成计算机指令序列。
      

  7.   


    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 在系统什么目录(地方)可以找到?