Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JNI сигнатура, как обозначается тип String? 
V
    Опции темы
Sergio
  Дата 4.2.2007, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

Репутация: нет
Всего: 1



Здраствуйте. Как обозначается тип String в JNI DLL? Вот ссылка: http://java.sun.com/j2se/1.5.0/docs/guide/...pes.html#wp9502 но здесь не все обозначения smile  Помогите пожалуйста. Вот у меня такая функция в длл-еке:
Код

 JNIEXPORT void JNICALL Java_TCPSender_Connect(JNIEnv *, jobject, String ip, jint port)
{
    if (wsaerror!=0)
   cout<<"Loading winsock ... ERROR";

 char _ip[15] = {0};
  for (int i = 0; i < ip.length(); i++)
   {
     _ip[i] = ip[i];
   }

   // Internet technology (TCP,UDP etc)
   sockaddr_in AdressInfo;                                  
    AdressInfo.sin_family = AF_INET;
    AdressInfo.sin_port = htons(port);
    AdressInfo.sin_addr.s_addr=inet_addr(_ip);
    int AdressInfoSize = sizeof(AdressInfo);

         int error = connect(mySocket,(SOCKADDR*)&AdressInfo,AdressInfoSize);
          switch(error)
           {
             case 0: cout<<"Connect process . . . OK\n"; break;
             case WSAECONNREFUSED: cout<<"\tConnect process . . . Error(queue problem)\n"; break; 
             case WSAETIMEDOUT: cout<<"\tSend process . . . Error(queue problem)\n"; break;
             default: cout<<"Send to server . . . Error(server is inaccessible or properties are failed )\n"; break; 
           };
}

В параметрах функции String ip так и должен быть или записуется по-другому?

Это сообщение отредактировал(а) Sergio - 4.2.2007, 21:21
PM MAIL ICQ   Вверх
powerOn
Дата 4.2.2007, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



попробуй jstring

источник


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Sergio
Дата 4.2.2007, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

Репутация: нет
Всего: 1



powerOn, не то smile  Ошибку выбивает: мол не может переконвертировать с jstring у const char[10]

Это сообщение отредактировал(а) Sergio - 4.2.2007, 22:40
PM MAIL ICQ   Вверх
Enflout
Дата 4.2.2007, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 260
Регистрация: 22.5.2004

Репутация: 1
Всего: 6



GetStringUTFChars
Цитата
Returns a pointer to an array of bytes representing the string in modified UTF-8 encoding. This array is valid until it is released by ReleaseStringUTFChars().


ReleaseStringUTFChars
Цитата
Informs the VM that the native code no longer needs access to utf. The utf argument is a pointer derived from string using GetStringUTFChars().


Попробуй так:
Сначала 
const char* ipc = env->GetStringUTFChars(ip, 0);
А потом, в конце
env->ReleaseStringUTFChars(ip, ipc);

P.S. Возможно придется немного исправить программу.

PM MAIL   Вверх
LSD
Дата 5.2.2007, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Sergio, что ты велосипед изобретаешь. Есть же утилита javah - даешь ей класс с объявленой native функцией, и она сам сгенерирует правильный h файл, с правильными типами.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Любитель
Дата 5.2.2007, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: нет
Всего: 92



Не забывай только, что с троки у тебя будут в UTF-8. Сам jstring - вообще вроде дескрипторы в системной таблице JVM.

Да, кстати, глянь тут smile

Enflout, у тебя та же ошибка, что и по ссылке выше.  smile 


--------------------
PM MAIL ICQ Skype   Вверх
Sergio
Дата 5.2.2007, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

Репутация: нет
Всего: 1



Всем спасибо. Получилось smile 
PM MAIL ICQ   Вверх
Enflout
Дата 6.2.2007, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 260
Регистрация: 22.5.2004

Репутация: 1
Всего: 6



Цитата(Любитель @  5.2.2007,  18:28 Найти цитируемый пост)
Enflout, у тебя та же ошибка, что и по ссылке выше.

А вот тут я не совсем согласен

Цитата из книги Эккеля Thinking In Java, 2 ed.
Цитата

env->ReleaseStringUTFChars(jMsg, msg);

также может быть вызвано из С следующим образом:

(*env)->ReleaseStringUTFChars(env, jMsg, msg);

Вы заметили, что строка на С гораздо сложнее (что естесственно) - вам необходимо двойное разыменование указателя на env. Вы также должны передать этот указатель в качестве первого параметра при вызове JNI функции. Примеры данного приложения используют С++ стиль.


По ссылке выше автор писал код на C, а автор этой темы пишет на C++, посмотрите хотя бы на цикл for. Так почему бы не использовать
env->ReleaseStringUTFChars(jMsg, msg);
?

СУВ
PM MAIL   Вверх
Любитель
Дата 7.2.2007, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: нет
Всего: 92



А ты проверь. Не знаю - у меня не компилится. В jni.h имеем лишь
Код

struct JNIEnv;

То есть даже определение сей структуры от нас скрыто. Никаких методов у неё нет. Если мы подкинем компилеру формальное определение JNIEnv как
Код

struct JNIEnv
{
    jbyte ReleaseStringUTFChars(jstring*, jbyte*);
};

то сие скомпилится. Более того будет работать (за исключением создание/копирвоание JNIEnv - мы не знаем её размер), так как при вызове метода, яактически, неявно первым параметром идёт указатель на объект. Но во всей папке include из JDK я такого не нашёл  smile Да и в любом случае, это грязный хак (аналогичной подменой определений можно и скажем прайват-поля поменять  smile )

Да и на java.sun.com/docs мы находим лишь определение глобальной функции, но не метода.


--------------------
PM MAIL ICQ Skype   Вверх
Enflout
Дата 8.2.2007, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 260
Регистрация: 22.5.2004

Репутация: 1
Всего: 6



Стоп-стоп-стоп.
Я тут посмотрел свой jni.h (прилагается в конце поста). Все цитаты из него.

Цитата

#ifdef __cplusplus
typedef JNIEnv_ JNIEnv;
#else
typedef const struct JNINativeInterface_ *JNIEnv;
#endif

Это раз

Цитата

struct JNINativeInterface_ {
    // …
    const char* (JNICALL *GetStringUTFChars)
      (JNIEnv *env, jstring str, jboolean *isCopy);
    void (JNICALL *ReleaseStringUTFChars)
      (JNIEnv *env, jstring str, const char* chars);
    // …
}

/*
 * We use inlined functions for C++ so that programmers can write:
 *
 *    env->FindClass("java/lang/String")
 *
 * in C++ rather than:
 *
 *    (*env)->FindClass(env, "java/lang/String")
 *
 * in C.
 */


Это два

Цитата

struct JNIEnv_ {
    const struct JNINativeInterface_ *functions;
#ifdef __cplusplus

    // …
    const char* GetStringUTFChars(jstring str, jboolean *isCopy) {
        return functions->GetStringUTFChars(this,str,isCopy);
    }
    void ReleaseStringUTFChars(jstring str, const char* chars) {
        functions->ReleaseStringUTFChars(this,str,chars);
    }
    // …

Это три

Так что структура имеет методы и даже в комментариях jni.h написан допустимый подход к написанию C++ программ.  
СУВ  smile 

PS
http://ifolder.ru/1065648 - jni.h
PM MAIL   Вверх
Любитель
Дата 8.2.2007, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: нет
Всего: 92



Enflout, версия JDK?

У меня сего нету. Если хочешь - могу куды-нибудь выложить свой jni.h.


--------------------
PM MAIL ICQ Skype   Вверх
Enflout
Дата 9.2.2007, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 260
Регистрация: 22.5.2004

Репутация: 1
Всего: 6



1.5.0
А у тебя?

Цитата(Любитель @  8.2.2007,  23:35 Найти цитируемый пост)
Если хочешь - могу куды-нибудь выложить свой jni.h

Выкладывай конечно  smile 
PM MAIL   Вверх
Enflout
Дата 9.2.2007, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 260
Регистрация: 22.5.2004

Репутация: 1
Всего: 6



PM MAIL   Вверх
Любитель
Дата 9.2.2007, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: нет
Всего: 92



Наконец-таки пишу со своего компа  smile 

Enflout, мои извинения - я жестоко обманул  smile JDK у меня 1.6, но не в этом дело. Поверил онлайн-докам (найдя там только глобал-функцию), дома бегло глянул jni.h - и написал всё сие. Сейча основательно просмотрел - хотя в начале там действительно просто declaration JNIEnv_, гораздо ниже есть практически то, о чём писал ты.

Ещё раз сорри.


--------------------
PM MAIL ICQ Skype   Вверх
Enflout
Дата 10.2.2007, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 260
Регистрация: 22.5.2004

Репутация: 1
Всего: 6



Цитата(Любитель @  9.2.2007,  14:04 Найти цитируемый пост)
Enflout, мои извинения - я жестоко обманул

Да ладно тебе. В любом случае было приятно поболтать.
СУВ  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.5435 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.