На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! Следующие правила действуют в данном разделе в дополнение к общим Правилам Форума
1. Здесь обсуждается Java, а не JavaScript! Огромная просьба, по вопросам, связанным с JavaScript, SSI и им подобным обращаться в раздел WWW Masters или, на крайний случай, в Многошум.
2. В случае, если у вас возникают сомнения, в каком разделе следует задать свой вопрос, помещайте его в корневую ветку форума Java. В случае необходимости, он будет перемещен модераторами (с сохранением ссылки в корневом разделе).

3. Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.
4. Не рекомендуется создавать несколько несвязанных вопросов в одной теме. Пожалуйста, создавайте по одной теме на вопрос.
Модераторы: dark_barker, wind
  
> конвертировать jstring to LCPWSTR
    Доброго времени суток.
    Ситуация следующая. Существует сторонняя dll-библиотека без доступа к исходникам(STF.dll) и программа на java. Необходимо использовать функции библиотеки в программе с помощью JNI(обязательное условие).
    Сейчас подключение выглядит так.

    java:
    ExpandedWrap disabled
      public class DllUse {
          private static String dirPath;
          static{
              try{  
                  dirPath = ..путь..; ///путь до библиотеки
                  System.load(dirPath+"libDllUse.dll");                    
              } catch(Exception ex) {}
          }
       
          public static int connectDl(){
              return new DllUse().connectDll(dirPath+"STF.dll");
          }
          private native int connectDll(String path);
      }


    jni прослойка libDllUse.с
    ExpandedWrap disabled
      static HINSTANCE mod;
      JNIEXPORT jint JNICALL Java_DllUse_connectDll
      (JNIEnv *env, jobject obj, jstring path)
      {  
          const char* ipstr=(*env)->GetStringUTFChars(env, path, NULL);
       
          wprintf((const wchar_t *)ipstr);  //стр1
       
          mod=LoadLibrary((const wchar_t *)ipstr);
          (*env)->ReleaseStringUTFChars(env, path, ipstr1);
          if (mod == NULL) {  return -1;}
          return 1;
      }

    После вызова функция connectDl() возвращает -1, следовательно подключение не происходит. стр1 выводит:
    ..путь..\STF.dll_Разнообразная_Абракадабра

    Как скормить jstring path функции
    ExpandedWrap disabled
      HMODULE WINAPI LoadLibrary(_In_ LPCTSTR lpFileName);
    ?
    Или что ещё можно придумать в рамках заданных условий?
    Буду рада любой помощи.

    PS.
    ExpandedWrap disabled
      LoadLibrary(TEXT("..путь..\STF.dll"));
    отлично работает, но путь до библиотек задается в java-программе (обязательное условие);
      Цитата Anka-BOIN @
      public static int connectDl(){
      return new DllUse().connectDll(dirPath+"STF.dll");
      }


      Пробовали в си-стиле делать?

      Для wchar_t*
      ExpandedWrap disabled
        public static int connectDl(){
            return new DllUse().connectDll(dirPath+"STF.dll\0x00");
        }


      Добавлено
      В общем, попробую объяснить свою позицию. В яве строки (String) более правильные с точки зрения человека, то есть, имеется адрес начала строки, и длинна строки. В сях, ваш wchar_t* имеет адрес начала, но, не имеет длинны.

      Отсюда, чтобы узнать длину строки в яве, достаточно прочитать эту длину в области, недалеко от адреса начала массива данных (собственно, самой строки), как это сделано более подробно - это другой вопрос. Для того чтобы узнать длинну строки в сях, введено такое понятие как терминатор строки, суть в следующем, обращаемся по адресу начала строки, далее, смещаем курсор, читая по одному (или несколько) байту до тех пор, пока не натолкнёмся на \0x00 терминатор (если читаем по несколько байт, скорее всего, достаточно того случая когда первый байт 0x00, но, могу ошибаться, и важно заполнить весь буфер \0x00 терминаторами).

      Вот и получается - вы в памяти резервируете явой строку dirPath+"libDllUse.dll", сишный код начинает искать конец этой строки, и пропускает курсор далеко за вашу строку, пока где то там, в памяти не наткнётся на \0x00 терминатор.
      Сообщение отредактировано: VisualProg -
      CyberLock | BloodBath-LAN
      Немного творчества - альбом ArtMetal [Metal, Instrumental, Orchestral]
      1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script Execution time: 0,1335 ]   [ 14 queries used ]   [ Generated: 28.07.17, 13:05 GMT ]