powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JNI
12 сообщений из 37, страница 2 из 2
JNI
    #34019459
JNI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNI
Гость
Или при некоторых вариантах запустится пустое черное DOS окно и исчезнет, не оставя за собой никаких следов в виде файлов :(
...
Рейтинг: 0 / 0
JNI
    #34019466
foo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
foo
Гость
Да.

Вот мой лог из консоли:

D:\Native>dir /b
Native.java

D:\Native>echo %JAVA_HOME%
C:\jdk1.5.0_06

D:\Native>%JAVA_HOME%/bin/javac Native.java

D:\Native>dir /b
Native.class
Native.java

D:\Native>%JAVA_HOME%/bin/javah -jni Native

D:\Native>dir /b
Native.class
Native.h
Native.java

D:\Native>

по идее должно помочь
...
Рейтинг: 0 / 0
JNI
    #34019572
JNI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNI
Гость
Проверил наличие переменной окружения JAVA_HOME . Нет такой. Создал SET JAVA_HOME = C:\Program Files\Java|Developer\jdk. . Проверяю echo %JAVA_HOME% , в ответ выдает строку %JAVA_HOME% . Просмотрел список всех переменных окружения SET -там есть и в нужной форме. Чепуха.
...
Рейтинг: 0 / 0
JNI
    #34019584
JNI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNI
Гость
JNIПроверил наличие переменной окружения JAVA_HOME . Нет такой. Создал SET JAVA_HOME = C:\Program Files\Java|Developer\jdk. . Проверяю echo %JAVA_HOME% , в ответ выдает строку %JAVA_HOME% . Просмотрел список всех переменных окружения SET -там есть и в нужной форме. Чепуха.
Так, это был мой глюк. Написал SET JAVA_HOME = C:\Program Files\Java|Developer\jdk. с пробелами с обоих сторон относительно знака "="
...
Рейтинг: 0 / 0
JNI
    #34019636
JNI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNI
Гость
fooДа.

Вот мой лог из консоли:

D:\Native>dir /b
Native.java

D:\Native>echo %JAVA_HOME%
C:\jdk1.5.0_06

D:\Native>%JAVA_HOME%/bin/javac Native.java

D:\Native>dir /b
Native.class
Native.java

D:\Native>%JAVA_HOME%/bin/javah -jni Native

D:\Native>dir /b
Native.class
Native.h
Native.java

D:\Native>

по идее должно помочь
Набираю в командной строке Total commandr и Far
Код: plaintext
1.
D:\ Native >%JAVA_HOME%/bin/javah -jni  Native 
D:\ Native >%JAVA_HOME%/bin/javac  Native .java
Не работает
...
Рейтинг: 0 / 0
JNI
    #34019679
foo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
foo
Гость
автор
Набираю в командной строке Total commandr и Far
D:\Native>%JAVA_HOME%/bin/javah -jni Native
D:\Native>%JAVA_HOME%/bin/javac Native.java
Не работает


А в такой последовательности и не будет работать.

надо:

D:\Native>%JAVA_HOME%/bin/javac Native.java
D:\Native>%JAVA_HOME%/bin/javah -jni Native

Почему - RTFM
...
Рейтинг: 0 / 0
JNI
    #34019708
JNI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNI
Гость
foo автор
Набираю в командной строке Total commandr и Far
D:\Native>%JAVA_HOME%/bin/javah -jni Native
D:\Native>%JAVA_HOME%/bin/javac Native.java
Не работает


А в такой последовательности и не будет работать.

надо:

D:\Native>%JAVA_HOME%/bin/javac Native.java
D:\Native>%JAVA_HOME%/bin/javah -jni Native

Почему - RTFM
Это я понял, я имел в виду, что не одна их них не работает.
D:\Native>%JAVA_HOME%/bin/javah -jni Native должна работать, когда есть Native.class и Native.java . А D:\Native>%JAVA_HOME%/bin/javac Native.java достаточно только Native.class .
Суть в том, что ничего это не работает. Может это быть из-за того, что java "говорит" ???
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Target  Native .java is not runnable, using  default  target  Native .java.
"C:\Program Files\Java\Developer\jdk\bin\javaw.exe" -ojvm -classpath D:\ПРОЕКТЫ\Application\Project\classes mypackage. Native 
Exception in thread main
java.lang.UnsatisfiedLinkError: no device 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. Native .<clinit>( Native .java: 11 )

Process exited with exit code  1 .
...
Рейтинг: 0 / 0
JNI
    #34019733
JNI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNI
Гость
Код: plaintext
Теперь скомпилируйте ваш исходный файл на Java и запустите javah с полученным файлом . class  в качестве параметра, указав ключ —jni (это выполнится автоматически за вас с помощью makefile, присутствующим в исходном коде для книги):
Я не компилировал, но файл с нужным именем появился. Т.е. я пытался компилировать, но JAVA ругалась. Может поэтому и не работает, что NAtive.class "кривой" получился?
...
Рейтинг: 0 / 0
JNI
    #34019740
foo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
foo
Гость
JNI
Это я понял, я имел в виду, что не одна их них не работает.
D:\Native>%JAVA_HOME%/bin/javah -jni Native должна работать, когда есть Native.class и Native.java. А D:\Native>%JAVA_HOME%/bin/javac Native.java достаточно только Native.class.
Суть в том, что ничего это не работает. Может это быть из-за того, что java "говорит" ???


НЕТ!!!

javac - это КОМПИЛЯТОР!!!! Он из ИСХОДНОГО ТЕКСТА, КОТОРЫЙ НАХОДИТЬСЯ В Native.java(!!!), "ДЕЛАЕТ" Native.class

После того, как сделан Native.class надо "скормить" его javah. Для этого исходник уже НЕ НУЖЕН!

результатом выполнения javah буде Native.h

Native.h надо имплементировать в device.dll - тоесть написать реализацию методов хедера.

исходный код device.dll надо скомпилировать компилятором C/C++.

полученную dll-ку скормить java.
...
Рейтинг: 0 / 0
JNI
    #34020002
JNI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNI
Гость
C этой частью разобрался! Надо было настроить переменные среды JAVA_HOME и PATH
...
Рейтинг: 0 / 0
JNI
    #34021782
JNI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JNI
Гость
автор
Код: plaintext
1.
2.
3.
4.
5.
6.
typedef struct
{
        DWORDU[ 3 ];
        WORD A;
         BYTE  S;
         BYTE  Reserv;
}JNITUID

Как вы собрираетесть из java передавать эту структуру в Write(unsigned char* Data, TUID &UID, unsigned char Pam, unsigned char KSet);
Для нее надо бы заводить отдельный класс c native методами для доступа к полям и хранить в нем указатель на native структуру. Тогда при передаче экземпляра этого класса в native метод в качестве параметра сможете получить указатель на структуру и передать его в качестве параметра в нужную функцию.
Вот это как-то не очень понятно.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 public   class  UID
{
   public  String[] U;
   public  String A;
   public   byte  S;
   public   byte  Reserv;
}
  native   int  Write( char [] Data,  UID CUID,  char  Pam,  char  KSet);
Так что ли?
...
Рейтинг: 0 / 0
JNI
    #34022213
foo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
foo
Гость
JNIТак что ли?

Нет.

Я имел ввиду следующее:

Вот такой java класс:

Код: 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.
39.
40.
41.
42.
43.
44.
45.
 public   class  TUID {
    
     /**
     * Pointer to native TUID instance
     */
     private   long  tuidPoinger; //32-bit pointer to native structure

     public  TUID() {
         this .tuidPoinger = init();
    }

     public   native   int [] getU();

     public   native   void  setU( int [] u);

     public   native   int  getA();

     public   native   void  setA( int  a);

     public   native   byte  getS();

     public   native   void  setS( byte  s);

     public   native   byte  getReserv();

     public   native   void  setReserv( byte  reserv);

    /**
     * to allocate native TUID
     *
     * @return native TUID pointer
     */
     private   native   long  init();

    /**
     * to destroy native TUID
     */
     private   native   void  destroy();

     protected   void  finalize()  throws  Throwable {
        destroy();
         super .finalize();
    }
}



Получаем хедер:

Код: 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.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class TUID */

#ifndef _Included_TUID
#define _Included_TUID
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     TUID
 * Method:    getU
 * Signature: ()[I
 */
JNIEXPORT jintArray JNICALL Java_TUID_getU
  (JNIEnv *, jobject);

/*
 * Class:     TUID
 * Method:    setU
 * Signature: ([I)V
 */
JNIEXPORT void JNICALL Java_TUID_setU
  (JNIEnv *, jobject, jintArray);

/*
 * Class:     TUID
 * Method:    getA
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_TUID_getA
  (JNIEnv *, jobject);

/*
 * Class:     TUID
 * Method:    setA
 * Signature: (I)V
 */
JNIEXPORT void JNICALL Java_TUID_setA
  (JNIEnv *, jobject, jint);

/*
 * Class:     TUID
 * Method:    getS
 * Signature: ()B
 */
JNIEXPORT jbyte JNICALL Java_TUID_getS
  (JNIEnv *, jobject);

/*
 * Class:     TUID
 * Method:    setS
 * Signature: (B)V
 */
JNIEXPORT void JNICALL Java_TUID_setS
  (JNIEnv *, jobject, jbyte);

/*
 * Class:     TUID
 * Method:    getReserv
 * Signature: ()B
 */
JNIEXPORT jbyte JNICALL Java_TUID_getReserv
  (JNIEnv *, jobject);

/*
 * Class:     TUID
 * Method:    setReserv
 * Signature: (B)V
 */
JNIEXPORT void JNICALL Java_TUID_setReserv
  (JNIEnv *, jobject, jbyte);

/*
 * Class:     TUID
 * Method:    init
 * Signature: ()J
 */
JNIEXPORT jlong JNICALL Java_TUID_init
  (JNIEnv *, jobject);

/*
 * Class:     TUID
 * Method:    destroy
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_TUID_destroy
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif


И пишем реализацию(Не проверял на наличие ошибок, но идея должна быть понятна), подключив все нужные хедеры.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#include "TUID.h"

JNIEXPORT jint JNICALL Java_TUID_getA(JNIEnv * env, jobject this){
          jclass cls = (*env)->GetObjectClass(env, this);
	  jfieldID fid = (*env)->GetFieldID(env, cls, "tuidPoinger", "J");
	  TUID * pTUID; 
	jint p = (*env)->GetLongField(env,this, fid);
	pTUID =(TUID *) p;
	  return (jint)pTUID->A;
}


JNIEXPORT jlong JNICALL Java_TUID_init(JNIEnv * env, jobject this){
	  TUID * pTUID = (TUID *)malloc(sizeof(struct TUID));
	  return (jint)pTUID;
}

и так для остальных методов

Тогда при создании класса TUID мы будет автоматически создаваться nativeная структура. И при уборке мусора она,если надо, будет уничтожена GC. Мы получим доступ ко всем полям структуры и сможем легко получать указатель на нее, если нам надо передать ее в качестве параметра в функцию.
...
Рейтинг: 0 / 0
12 сообщений из 37, страница 2 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / JNI
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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