Звуковой сигнал JNA () не может найти символ?

В приведенном ниже коде я получаю сообщение об ошибке, и почему-то я не смог найти информацию, чтобы исправить это. Извините за недоразумения.

import com.sun.jna.Library;
import com.sun.jna.Native; 
import com.sun.jna.platform.win32.Kernel32;
// JNA infrastructure import libs.Kernel32; 
// Proxy interface for kernel32.dll 

public interface JnaTests extends Library {
  public boolean Beep(int FREQUENCY , int DURATION );
  static Kernel32 kernel32 = (Kernel32) Native.loadLibrary("kernel32",   Kernel32.class); 
  static void toMorseCode(String letter) throws Exception { 
  for (byte b : letter.getBytes()) { 
   kernel32.Beep(1200, ((b == '.') ? 50 : 150)); 
   Thread.sleep(50); 
  } 
 } 
 public static void main(String[] args) throws Exception { 
   String helloWorld[][] = { {"....", ".", ".-..", ".-..", "---"}, {".--", "---", ".-.", ".-..", "-.."}}; 
   for (String word[] : helloWorld) { 
    for (String letter : word) { 
     toMorseCode(letter); 
     Thread.sleep(150); 
    } 
    Thread.sleep(350); 
   }
  } 
 }

person Tech-IO    schedule 23.04.2016    source источник


Ответы (2)


Вы используете неправильное имя для класса Kernel32. Вы импортировали его с помощью этой строки:

import com.sun.jna.platform.win32.Kernel32;

Но вы пытаетесь использовать его с неправильным именем:

kernel32.Beep(1200, ((b == '.') ? 50 : 150));

Обратите внимание на заглавные буквы.

Стоит отметить, что любые пакеты в иерархии com.sun по своей сути небезопасны для использования — они предназначены для использования полностью внутри Java и не предназначены для использования в ваших программах. Они могут меняться без предупреждения или обратной совместимости, и могут иметь чрезвычайно специфические недокументированные требования, которые делают их ненадежными для вас.

Звуковой сигнал, в частности, очень зависит от аппаратного обеспечения и платформы, и вам не гарантируется, что этот код будет работать даже в разных системах Windows, не говоря уже о других ОС. Вам лучше воспроизвести реальный звуковой файл, так как он будет работать везде и даст вам стабильные результаты. Подробнее см. Java-эквивалент C# system.beep?. подробное обсуждение того, что вы, кажется, после.

person Knetic    schedule 23.04.2016
comment
Здравствуйте, спасибо за ответ. Это просто для целей тестирования, как использование JNA. Код представляет собой пример кода документа сообщества Oracle. Импорт был единственным вариантом исправления ошибки в netbeans. - person Tech-IO; 23.04.2016

Спасибо за ответы.

Наконец я обнаружил, что должен быть интерфейс (Kernel32) в отдельном файле.

Это было упомянуто в документации сообщества, однако некоторые .dll работали и без интерфейса, например. User32.dll .

package com.sun.jna.platform;

import com.sun.jna.Library;


//@author windows-System

public class win32 {

 public interface Kernel32 extends Library {

 boolean Beep(int frequency, int duration); 
 // ... (lines deleted for clarity) ... }   
}

}

Основной файл

import com.sun.jna.Library;
import com.sun.jna.Native; 
import com.sun.jna.platform.win32.Kernel32;

// JNA infrastructure import libs.Kernel32; 
// Proxy interface for kernel32.dll 

public class JnaTests {

private static Kernel32 kernel32 = (Kernel32)                    
Native.loadLibrary ("kernel32",   Kernel32.class);

private static void toMorseCode(String letter) throws Exception { 
 for (byte b : letter.getBytes()) { 
  kernel32.Beep(1200, ((b == '.') ? 50 : 150)); 
  Thread.sleep(50); 
 }  
} 

public static void main(String[] args) throws Exception { 
 String helloWorld[][] = { {"....", ".", ".-..", ".-..", "---"}, 
 {".--",  "---", ".-.", ".-..", "-.."}}; 

for (String word[] : helloWorld) { 
 for (String letter : word) { 
  toMorseCode(letter); 
  Thread.sleep(150); 
 } 
 Thread.sleep(350); 
}

} }

person Tech-IO    schedule 24.04.2016