powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JNI
25 сообщений из 37, страница 1 из 2
JNI
    #34013334
JNI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNI
Гость
Пытаюсь заюзать dll из JAVA. Следую инструкции в книге и на первом же шаге уткнулся в стену. На JAVA работал мало. Использую JDeveloper.

Так вот создаю....
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 package  mypackage;
 public   class  ShowMessage {
   private   native   void  ShowMessage(String msg);
   static  {
    System.loadLibrary("MsgImpl");
}
   public   static   void  main(String[] args) {
    ShowMessage app =  new  ShowMessage();
    app.ShowMessage("Generated with JNI");
  }
}
Строка private native void ShowMessage(String msg); в соответствующем цвете и Java Virtual Machine Launcher
выдает
Код: plaintext
Could not find main  class .Programm will exit

плюс ко всему
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Exception in thread main
java.lang.UnsatisfiedLinkError: no MsgImpl in java.library.path

	at java.lang.ClassLoader.loadLibrary(ClassLoader.java: 1491 )

	at java.lang.Runtime.loadLibrary0(Runtime.java: 788 )

	at java.lang.System.loadLibrary(System.java: 834 )

	at mypackage.ShowMessage.<clinit>(ShowMessage.java: 5 )

Process exited with exit code  1 .
...
Рейтинг: 0 / 0
JNI
    #34013383
JNI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNI
Гость
JNIПытаюсь заюзать dll из JAVA.
Как заюзать? Переформулируй вопрос что ты хочеш? А по поводу ошибки тебе явно сказанно что dll, нету в пути поиска dll. В доке описанно где JVM ищет по умолчанию и где её надо класть. И как добавить путь поиска.
...
Рейтинг: 0 / 0
JNI
    #34013445
JNI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNI
Гость
Хочу в JAVA вызвать функцию dll, написанную на С++
...
Рейтинг: 0 / 0
JNI
    #34013556
JNI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNI
Гость
А как узнать, где java.library.path ?
...
Рейтинг: 0 / 0
JNI
    #34014557
foo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
foo
Гость
полезная ссылка


java.library.path - это путь к каталогу, где у тебя храниться твоя dll.

это если указывать через опцию -Djava.library.path (см. ссылку выше)

динамические библиотеки можно подключать из самого приложения:



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 class  Cls { 

      native   double  f( int  i, String s); 

      static  { 

         System.loadLibrary(“pkg_Cls.dll”); 

     } 

} 

(см. ссылку выше.)

Кроме того, имена функций в dll должны формироваться по определенному правилу(см. ссылку выше.)

java.sun.com
Dynamic linkers resolve entries based on their names. A native method name is concatenated from the following components:

1.the prefix Java_
2.a mangled fully-qualified class name
3.an underscore (“_”) separator
4.a mangled method name
5.for overloaded native methods, two underscores (“__”) followed by the mangled argument signature

The VM checks for a method name match for methods that reside in the native library. The VM looks first for the short name; that is, the name without the argument signature. It then looks for the long name, which is the name with the argument signature. Programmers need to use the long name only when a native method is overloaded with another native method. However, this is not a problem if the native method has the same name as a nonnative method. A nonnative method (a Java method) does not reside in the native library.

In the following example, the native method g does not have to be linked using the long name because the other method g is not a native method, and thus is not in the native library.
...
Рейтинг: 0 / 0
JNI
    #34014567
foo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
foo
Гость
полезная ссылка


java.library.path - это путь к каталогу, где у тебя храниться твоя dll.

это если указывать через опцию -Djava.library.path (см. ссылку выше)

динамические библиотеки можно подключать из самого приложения:



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 class  Cls { 

      native   double  f( int  i, String s); 

      static  { 

         System.loadLibrary(“pkg_Cls.dll”); 

     } 

} 

(см. ссылку выше.)

Кроме того, имена функций в dll должны формироваться по определенному правилу(см. ссылку выше.)

java.sun.com
Dynamic linkers resolve entries based on their names. A native method name is concatenated from the following components:

1.the prefix Java_
2.a mangled fully-qualified class name
3.an underscore (“_”) separator
4.a mangled method name
5.for overloaded native methods, two underscores (“__”) followed by the mangled argument signature

The VM checks for a method name match for methods that reside in the native library. The VM looks first for the short name; that is, the name without the argument signature. It then looks for the long name, which is the name with the argument signature. Programmers need to use the long name only when a native method is overloaded with another native method. However, this is not a problem if the native method has the same name as a nonnative method. A nonnative method (a Java method) does not reside in the native library.

In the following example, the native method g does not have to be linked using the long name because the other method g is not a native method, and thus is not in the native library.
...
Рейтинг: 0 / 0
JNI
    #34014842
JNI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNI
Гость
И ещё одно я не понял, при чтении статей. У меня есть dll, но её разрабатывал не я и нет её исходников. Могу ли я её "прицепить" к java, если она писалась под Delphi и Си. Т.е требуются ли доработки в dll для использования в Java? Извиняюсь за утренний сумбур...
...
Рейтинг: 0 / 0
JNI
    #34015064
Евгений Путилин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JNIИ ещё одно я не понял, при чтении статей. У меня есть dll, но её разрабатывал не я и нет её исходников. Могу ли я её "прицепить" к java, если она писалась под Delphi и Си. Т.е требуются ли доработки в dll для использования в Java? Извиняюсь за утренний сумбур...
Угу. Видно что чел, не читает присланные ему ссылки. Ты не можеш вызвать функцию из DLL эсли она не написанна для использвоания с java.
В твоем случае MsgImpl.dll должна экспортировать метод
Java_mypackage_ShowMessage_ShowMessage. Проверить ты это можеж используюя утилиту impdef которая создаст def для dll.

Но скорее всего ты хочеш вызвать метод который экспортируется как _ShowMessage, этого сделать нельзя.
...
Рейтинг: 0 / 0
JNI
    #34015144
JNI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNI
Гость
Евгений Путилин JNIИ ещё одно я не понял, при чтении статей. У меня есть dll, но её разрабатывал не я и нет её исходников. Могу ли я её "прицепить" к java, если она писалась под Delphi и Си. Т.е требуются ли доработки в dll для использования в Java? Извиняюсь за утренний сумбур...
Угу. Видно что чел, не читает присланные ему ссылки. Ты не можеш вызвать функцию из DLL эсли она не написанна для использвоания с java.
В твоем случае MsgImpl.dll должна экспортировать метод
Java_mypackage_ShowMessage_ShowMessage. Проверить ты это можеж используюя утилиту impdef которая создаст def для dll.

Но скорее всего ты хочеш вызвать метод который экспортируется как _ShowMessage, этого сделать нельзя.
Ссылку проситал, только хотел уточнить, а то у меня господа-товарищи говорят, что в java можно использовать любую dll, написанную для использования в С и Delphi
...
Рейтинг: 0 / 0
JNI
    #34015287
foo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
foo
Гость
Евгений Путилин Ты не можеш вызвать функцию из DLL эсли она не написанна для использвоания с java.
В твоем случае MsgImpl.dll должна экспортировать метод
Java_mypackage_ShowMessage_ShowMessage. Проверить ты это можеж используюя утилиту impdef которая создаст def для dll.


но никто не мешает написать свой враппер в виде DLL, оформленой соовтетствующим образом, и вызывать уже его методы. Это, конечно, скажется на производительности. Пример из книжки:

Код из *.h файла

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
typedef void * HANDLE;
typedef long DWORD;
typedef struct {...} SECURITY_ATTRIBUTES;
HANDLE CreateFile(
    const char *fileName,       // file name
    DWORD desiredAccess,        // access (read-write) mode
    DWORD shareMode,            // share mode
    SECURITY_ATTRIBUTES *attrs, // security attributes
    DWORD creationDistribution, // how to create
    DWORD flagsAndAttributes,   // file attributes
    HANDLE templateFile         // file with attr. to copy
);

Java класс, использующий dll

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 public   class  Win32 {
     public   static   native   int  CreateFile(
        String fileName,          // file name
         int  desiredAccess,        // access (read-write) mode
         int  shareMode,            // share mode
         int [] secAttrs,           // security attributes
         int  creationDistribution, // how to create
         int  flagsAndAttributes,   // file attributes
         int  templateFile);        // file with attr. to copy
    ...
}

Код враппера вызывающего функцию из целевой dll.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
JNIEXPORT jint JNICALL Java_Win32_CreateFile(
        JNIEnv *env,
        jclass cls,
        jstring  fileName,         // file name
	jint desiredAccess, // access (read-write) mode
        jint shareMode,            // share mode
        jintArray secAttrs,        // security attributes
        jint creationDistribution, // how to create
        jint flagsAndAttributes,   // file attributes
        jint templateFile)         // file with attr. to copy
{
    jint result =  0 ;
    jint *cSecAttrs = NULL;
    if (secAttrs) {
        cSecAttrs = env->GetIntArrayElements(secAttrs,  0 );
        if (cSecAttrs == NULL) {
            return  0 ; /* out of memory */
        }


    char *cFileName = JNU_GetStringNativeChars(env, fileName);
    if (cFileName) {
        /* call the real Win32 function */
        result = (jint)CreateFile(cFileName,
                       desiredAccess,
                       shareMode,
                       (SECURITY_ATTRIBUTES *)cSecAttrs,
                       creationDistribution,
                       flagsAndAttributes,
                       (HANDLE)templateFile);
        free(cFileName);
    }
    /* else fall through, out of memory exception thrown */
    if (secAttrs) {
        env->ReleaseIntArrayElements(secAttrs, cSecAttrs,  0 );
    }
    return result;
}
...
Рейтинг: 0 / 0
JNI
    #34015391
JNI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNI
Гость
Т.е., для того, чтобы использовать мою dll в JAVA, можно обойтись без исходников dll, а только написать врапер ? Т.е достатлчно MYDLL.H? Сорри - перевожу аглицкий очень долго. Изучал немецкий.
...
Рейтинг: 0 / 0
JNI
    #34015433
foo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
foo
Гость
JNIТ.е., для того, чтобы использовать мою dll в JAVA, можно обойтись без исходников dll, а только написать врапер ? Т.е достатлчно MYDLL.H?

Да.
...
Рейтинг: 0 / 0
JNI
    #34018295
JNI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNI
Гость
Столкнулся с двумя проблемами:
1. Использование Dll в Java
2. Никогда не писал dll, тем более в Си.

НА изучение уйдет много времени. Поэтому не примите за дерзость, прошу помощи в виде наставлений. Я не прошу написания кода, помогите просто подсказками. Может в результате получится какое нибудь руководство по использованию dll в Java. ДЛЯ ЧАЙНИКОВ.

Итак. У меня есть dll. И два файла *.h.
В первом список функций из dll, а другой состоит из конструкций типа
Код: plaintext
#define
и в нем описываются коды ошибок.

Теперь пытаюсь делать обвязку своей dll. Т.е. создам dll для Java, которая будет вызывать функции первой dll.
В Вorland С++ Builder 6
Код: plaintext
File-> New ->DLL WIZARD
. Т.к моя dll работает с USB девайсом (содержит команды по управлению устройством), то выбираю

Source Type -> C++ , а со всех остальный пунктов снимаю "галочки" (USE VCL, USE CLX, Multi Threaded, VC++ Style DLL)
...
Рейтинг: 0 / 0
JNI
    #34018420
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
JNI
    #34018477
JNI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNI
Гость
Timm тынц
Да я уже это читал и на русском, у меня опыт мал. Мне бы на примерах. Вот мой *.h (урезан)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
#ifndef Device
#define Device
#include <Errors.h>

typedef struct
{
	DWORD	U[ 3 ];
	WORD	A;
	 BYTE 	S;
	 BYTE 	Reserv;
} TUID;

extern "C"  int  __declspec(dllexport) __stdcall SearchDevices(AnsiString* DeviceName,  int  &DeviceCount);
extern "C"  int  __declspec(dllexport) __stdcall InitDevice(AnsiString DeviceName);
extern "C"  void  __declspec(dllexport) __stdcall ReleaseDevice( void );
extern "C"  int  __declspec(dllexport) __stdcall Write(unsigned  char * Data, TUID 
#endif 

Попытаюсь "собрать" враппер. Посмотрите, правильно ли я сделал.
...
Рейтинг: 0 / 0
JNI
    #34018486
JNI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNI
Гость
Последнюю функцию недописал
Код: plaintext
extern "C"  int  __declspec(dllexport) __stdcall WriteCard(unsigned  char * Data, TUID &UID, unsigned  char  Pam, unsigned  char  KSet);
...
Рейтинг: 0 / 0
JNI
    #34018615
JNI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNI
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
#ifndef Device
#define Device
#include <jni.h>
#include <DeviceDLL.h>



typedef struct
{
        DWORDU[ 3 ];
        WORD A;
         BYTE  S;
         BYTE  Reserv;
} JNITUID;

JNIEXPORT jboolean JNICALL Java_Win32_InitDevice
(jstring DeviceName)
{
          return  InitDevice(DeviceName);
}

JNIEXPORT jvoid JNICALL Java_Win32_ReleaseDevice
(jvoid)
{

}
JNIEXPORT jint JNICALL Java_Win32_SearchDevices
(jstring DeviceName, jint DeviceCount)
{
         return  SearchDevices(DeviceName, DeviceCount);
}

JNIEXPORT jint JNICALL Java_Win32_Write
(jchar Data, JNITUID UID, jchar Pam, jchar Kset)
{
         return  Write(Data, UID, Pam, Kset);
}
#endif

Есть здесь правда?
...
Рейтинг: 0 / 0
JNI
    #34018823
foo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
foo
Гость
JNIЕсть здесь правда

Пока писал пример вы уже почти разобрались :)
То, что бросилось в глаза:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
typedef struct
{
        DWORDU[ 3 ];
        WORD A;
        BYTE S;
        BYTE Reserv;
}JNITUID

Как вы собрираетесть из java передавать эту структуру в

WriteCard(unsigned char* Data, TUID &UID, unsigned char Pam, unsigned char KSet); ?

Для нее надо бы заводить отдельный класс c native методами для доступа к полям и хранить в нем указатель на native структуру. Тогда при передаче экземпляра этого класса в native метод в качестве параметра сможете получить указатель на структуру и передать его в качестве параметра в нужную функцию.

Второе.
SearchDevices(AnsiString* DeviceName, int &DeviceCount); возвращает, как я понимаю, код ошибки. В DeviceName она записывает список девайсов, а в DeviceCount - количество девайсов. В java примитивный тип int передается по значению. Так что Java_Win32_SearchDevices(jstring DeviceName, jint DeviceCount) изменит копию DeviceCount. И реального значения Вы не получите(могу. конечно, ошибиться). Кроме того, AnsiString* DeviceName, по идее должен бы быть jobjectArray (String[] в java классе) а не jstring как у Вас. Вообще, лучше завести отдельный класс для возвращаемого этой функцией результата и привести ее к виду вроде DeviceList SearchDevices();
...
Рейтинг: 0 / 0
JNI
    #34018856
JNI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNI
Гость
Спасибо за поддержку. Но чем больше читаю документации, тем больше путаюсь. Все таки, когда ж использовать javah?
...
Рейтинг: 0 / 0
JNI
    #34018899
foo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
foo
Гость
JNIВсе таки, когда ж использовать javah?
javah это утилита, которая входит в jdk. Вещь для облегчения нашей жизни.

Вот у нас есть java класс.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 public   class   Native  {

     public   native   int  SearchDevices(String[] DeviceName,  int  DeviceCount);

     public   native   int  InitDevice(String DeviceName);

     public   native   void  ReleaseDevice();

}

мы запускаем

javac Native.java
javah Native

и получаем то, о чем мы с Вами говорим - Native.h:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Native */

#ifndef _Included_Native
#define _Included_Native
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Native
 * Method:    SearchDevices
 * Signature: ([Ljava/lang/String;I)I
 */
JNIEXPORT jint JNICALL Java_Native_SearchDevices
  (JNIEnv *, jobject, jobjectArray, jint);

/*
 * Class:     Native
 * Method:    InitDevice
 * Signature: (Ljava/lang/String;)I
 */
JNIEXPORT jint JNICALL Java_Native_InitDevice
  (JNIEnv *, jobject, jstring);

/*
 * Class:     Native
 * Method:    ReleaseDevice
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_Native_ReleaseDevice
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif


Теперь имплементим его в нашей dll, и все счастливы :)
Если у нас будет не 3 функции а 300... Результат понятен.
...
Рейтинг: 0 / 0
JNI
    #34019067
JNI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNI
Гость
foo[quot JNI] Результат понятен.

Понятен, только пытаюсь сам так сделать (в Java написать этот класс) и не получается. Показывает ошибки. В JDeveloper создаю новый Application, новый Project , затем новый JAVA Class вставляю твой пример и ругается.
...
Рейтинг: 0 / 0
JNI
    #34019195
foo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
foo
Гость
JNI вставляю твой пример и ругается
И что говорит? У меня в eclipse не ругается. Попробуй из командной строки скомпилировать. Может говорит что package не тот?
А файлик правильно обозвал? (Он должен назаваться Native.java). А может ему слово Native не нравиться(вроде как ключевое слова языка, хотя java регистр различает)?
...
Рейтинг: 0 / 0
JNI
    #34019247
JNI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNI
Гость
foo JNI вставляю твой пример и ругается
И что говорит? У меня в eclipse не ругается. Попробуй из командной строки скомпилировать. Может говорит что package не тот?
А файлик правильно обозвал? (Он должен назаваться Native.java). А может ему слово Native не нравиться(вроде как ключевое слова языка, хотя java регистр различает)?

С этим тоже разобрался. Наклепал
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 package  mypackage;
 import  java.util.*;

 public   class   Native  {

     native   int  SearchDevices(String[] DeviceName,  int  DeviceCount);
     native   int  InitDevice(String DeviceName);
     native   void  ReleaseDevice();
     static  
    {
      System.loadLibrary("device");  
    }

     public   static   void  main(String args[]) {
         Native  n =  new   Native ();
    }
}

Скопировал полученный Native.class в D:\Native\Native.class
Запускаю в командной строке javac -jni в D:\Native\Native.class ?, а в ответ, что javac не является внутренней командой. Буду с этим разбираться, но уж точно, что я сегодня по крупному торможу. Спасибо foo за поддержку
...
Рейтинг: 0 / 0
JNI
    #34019334
foo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
foo
Гость
JNIСпасибо foo за поддержку
Да не за что :).
У нас тут не форум а чат получился :)

JNIjavac -jni в D:\Native\Native.class

javac - это компилятор java.

Надо не javac -jni, а javah -jni

.class НЕ НУЖНО!

если запускать в D:\Native\ надо

javah -jni Native

-jni - нужен в java 1.4, а в 1.5 - эта опция включена по умолчанию.

Что бы не получать сообщения о том, что javac не является внутренней командой надо запускать

windows:

%JAVA_HOME%\bin\java
%JAVA_HOME%\bin\javac
%JAVA_HOME%\bin\javah
%JAVA_HOME%\bin\остальные_утилиты_jdk

*nix:

$JAVA_HOME\bin\java
$JAVA_HOME\bin\javac
$JAVA_HOME\bin\javah
$JAVA_HOME\bin\остальные_утилиты_jdk

где %JAVA_HOME%($JAVA_HOME) - переменная окружения хранящая путь к коревому каталогу jdk.

т.е. в твоем случае %JAVA_HOME%\bin\javah -jni Native
...
Рейтинг: 0 / 0
JNI
    #34019416
JNI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNI
Гость
По всякому попробовал, пишет, что файл не найден. А куда долженрезультат сохранить, туда, где и Native?
...
Рейтинг: 0 / 0
25 сообщений из 37, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / JNI
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]