2012-09-27 2 views
1

Я сделал DLL в C++ и написал этот класс в Java:Dynamic Link Library & Java

public class VolumeControl { 

    public native float GetVolume(); 

    public native void SetVolume(float val); 

    public native void VolumeUp(); 

    public native void VolumeDown(); 

    public native void Mute(); 

    static { 
     System.load("some_path/VolumeControl.dll"); 
    } 
} 

это работает хорошо, если я буду называть функции из этого файла, но когда я пытаюсь сделать это:

public class Server { 

    public static void main(String[] args) { 
     VolumeControl ctrl = new VolumeControl(); 
     ctrl.Mute(); 
    } 
} 

я получаю это:

Exception in thread "main" java.lang.UnsatisfiedLinkError: 
RemoteControl.VolumeControl.Mute()V 

Оба класса находятся в том же пакете, конечно. Как я могу это решить? Благодарю.

Update1: ОК проблема была в том, что я добавил эти классы в пакет. Когда я перехожу к пакету по умолчанию, все работает хорошо. Но теперь, если я хочу использовать эту dll с разными пакетами, мне нужно ее перестроить.

Update2: На самом деле я не могу добавить его в пакет вообще, когда я пытаюсь: #javah VolumeControl, я получаю ошибку:

Could not find class file for 'VolumeControl'. 

Update3: Я добавил вручную наименование пакет для функций C++, и он работает. Благодарю.

+2

Посмотрите эту статью http://stackoverflow.com/questions/1358541/jni-hello-world-unsatisfied-link-error на UnsatisfiedLinkError. Я думаю, это поможет. –

+0

Привет. Проблема в том, что когда я пытаюсь вызывать Mute() из класса Server, но если я поместил этот класс в класс VolumeControl, он работает хорошо. – Michael

ответ

0

Использование утилиты javah может помочь, если вы интегрированы в make-файл, чтобы гарантировать, что интерфейс всегда принимается с обеих сторон (клиент/сервер).