Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Технология JNI, не работает пример :(


Автор: lexluther 23.11.2008, 02:47
Всем привет,

Занялся изучением технологии JNI и столкнулся с проблемой. Мой пример не работает хотя код написан по всем правилам.

Код C++ библиотеки сгенерированный при помощи javah:

#include <windows.h>
#include <jni.h>

extern "C" JNIEXPORT void JNICALL Java_MyJavaPackage_NextLevelClass_ShowCall(JNIEnv *, jobject);

И

#include "MyJavaPackage_NextLevelClass.h"

extern "C" JNIEXPORT void JNICALL Java_MyJavaPackage_NextLevelClass_ShowCall
  (JNIEnv *, jobject)
{
    MessageBox(NULL,"TEST","TEST",MB_OK);
}

Есть класс в котором я определил внешний нейтивный метод:

package MyJavaPackage;

public class NextLevelClass{
          
    static {
        try{
            System.load("G:\\Documents and Settings\\artiom\\My Documents\\NetBeansProjects\\MyDesktopApplication\\dist\\lib\\MyDynamicLibrary.dll");
        }
        catch(UnsatisfiedLinkError g)
        {
            System.out.print(g.getMessage() + " LIBRARY EXCEPTION");
        }
    }
    
    private static native void ShowCall();
    
    public void GiveIt()
    {
        try{
            ShowCall();
        }
        catch(UnsatisfiedLinkError g)
        {
            System.out.print(g.getMessage() + " METHOD EXCEPTION\n");
        }
    }
}

Сам код в вызывающей программе выглядит следующим образом:

        NextLevelClass NLC1 = new NextLevelClass();
        
        NLC1.GiveIt();

В результате при выполнении библиотека сама загружается идеально, но при вызове метода ShowCall возникает исключение UnsatisfiedLinkError. Подскажите пожалуйста в чем может быть проблема?

Версия ОС:
Windows XP Service Pack 3

Версия JAVA (java -version):
java version "1.6.0"
Java™ SE Runtime Environment (build 1.6.0-b105)
Java HotSpot™ Client VM (build 1.6.0-b105, mixed mode, sharing)

Среда разработки (About окно):
Product Version: NetBeans IDE 6.1 (Build 200805300101)
Java: 1.6.0; Java HotSpot™ Client VM 1.6.0-b105
System: Windows XP version 5.1 running on x86; Cp1251; uk_UA (nb)
Userdir: G:\Documents and Settings\artiom\.netbeans\6.1

Автор: Samotnik 23.11.2008, 13:35
оберни весь код в теги во всех своих темах
тогда и поговорим  smile 
очень трудно так смотреть что к чему 

Автор: rygel 23.11.2008, 19:53
у вас в аргументе метода:
Код

extern "C" JNIEXPORT void JNICALL Java_MyJavaPackage_NextLevelClass_ShowCall(JNIEnv *, jobject);
 
второй аргумент ссылается на объект класса NextLevelClass, хотя метод в классе объявлен как статический:
Код

private static native void ShowCall();


и объявление должно выглядеть так:

Код

extern "C" JNIEXPORT void JNICALL Java_MyJavaPackage_NextLevelClass_ShowCall(JNIEnv *, jclass);


Это означает что вам нужно или убрать static из объявления метода в классе, или перегенерить файл хедера (но еще проще изменить jobject на jclass)

Автор: ivg 24.11.2008, 02:02
<Dll project> -> Properties -> Build/Linker -> Command Line/Additional Options: в поле добавить
Код
-Wl,--kill-at

Вкратце объяснение, например, http://dev.eclipse.org/newslists/news.eclipse.tools.jdt/msg19993.html

Автор: barin_Student 24.11.2008, 08:20
Дублируете темы с другого форума... smile 
И там тоже код нормально не оформлен... smile 

Автор: SoulKeeper 24.11.2008, 12:38
Цитата(ivg @ 24.11.2008,  02:02)
<Dll project> -> Properties -> Build/Linker -> Command Line/Additional Options: в поле добавить
Код
-Wl,--kill-at

Вкратце объяснение, например, http://dev.eclipse.org/newslists/news.eclipse.tools.jdt/msg19993.html

Мда....

А вот Visual Studio 2008 батотает с JNI идеально smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)