Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
 Аватар для Reiji Cross
30 / 30 / 4
Регистрация: 14.05.2010
Сообщений: 57

Native функции

01.05.2011, 18:39. Показов 1853. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Передо мной стоит задача, написать dll и подключить ее к приложению на java. Все бы ничего, но функции из dll должны принимать строковые данные и возвращать их. С этим то и проблема, я пытаюсь передавать массив символов char, но как пересести в dll jcharArray в char[]. Вот коды файла заголовков и собственно самой dll.
C++
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
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class secondgeneration_myclass */
 
#ifndef _Included_secondgeneration_myclass
#define _Included_secondgeneration_myclass
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     secondgeneration_myclass
 * Method:    ReadFromFile
 * Signature: ([C)[C
 */
JNIEXPORT jcharArray JNICALL Java_secondgeneration_myclass_ReadFromFile
  (JNIEnv *, jclass, jcharArray);
 
/*
 * Class:     secondgeneration_myclass
 * Method:    SaveToFile
 * Signature: ([C[C)V
 */
JNIEXPORT void JNICALL Java_secondgeneration_myclass_SaveToFile
  (JNIEnv *, jclass, jcharArray, jcharArray);
 
#ifdef __cplusplus
}
#endif
#endif
C++
1
2
3
4
5
6
7
8
9
JNIEXPORT void JNICALL Java_secondgeneration_myclass_SaveToFile
  (JNIEnv *, jclass, jcharArray str, jcharArray filename)
{
    FILE *file;
    int length = strlen(buf);
    file = fopen(filename,"w");
    fwrite (str, sizeof(char), length, file) ;
    fclose(file);
}
Буду благодырен за любую помощь!
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.05.2011, 18:39
Ответы с готовыми решениями:

Кaк при испoльзoвaнии Native method передaть сишнoй функции пaрaметры и кaк принять oтвет?
Пoдскaжите пoжaлуйстa, кaк при испoлъзoвaнии Native method передaтъ сишнoй функции пaрaметри и кaк принйaтъ oтвет?

Native java
Мне стало интересно вот что. Говорят есть такие методы, нативные, например public native char toCharArray(); Мне интересно, где я...

Вызов native из dll библиотеки
файл Mydll.java public class Mydll { native public static void testfunc(); static { System.loadLibrary(&quot;Mydll&quot;); } public...

2
the_Leo
18.05.2011, 21:10
Лучший ответ Сообщение было отмечено Reiji Cross как решение

Решение

Наверное, поздновато, но может кому-нибудь пригодиться. Передача строки из Java в C++ библиотеку и обратно под Linux. Думаю, в Windows всё будет делаться похожим образом.

С++:
C++
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h> 
#include <errno.h>  
#include <termios.h>         
#include <sys/types.h>
#include <sys/stat.h> 
#include <signal.h>    
#include "com.h"             
 
JNIEXPORT jint JNICALL Java_com_exp(JNIEnv * je, jclass jclazz, jcharArray cmd)
{
  int i = 0;
  char *chars;
  jboolean isCopy;
  jchar *jchars;
  jsize strLen;
  char charBuf[] = "Bye!";
  jchar *jcharBuf;
  
  //Преобразавание jcharArray -> jchar -> char
  strLen = je->GetArrayLength(cmd);
  chars = (char *) calloc(strLen + 1, sizeof(char));
  jchars = je->GetCharArrayElements(cmd, &isCopy);
  for (i = 0; i < strLen; i++)   
  {   
    chars[i] = (char)jchars[i];  
  }
  chars[strLen] = '\0';
  printf("chars = %s\n", chars);
  
  //Преобразование char -> jchar
  strLen = sizeof(charBuf);
  jcharBuf = (jchar *) calloc(strLen, sizeof(jchar));
  for (i = 0; i < strLen; i++)   
  {   
    jcharBuf[i] = (jchar)charBuf[i];  
  }  
  
  //Передача массива символов в Java-метод
  jcharArray arr = je->NewCharArray(strLen);
  je->SetCharArrayRegion(arr, 0, strLen, (jchar*) jcharBuf);
  jmethodID targetMethodId = je->GetStaticMethodID(jclazz, "callback", "([CI)V");
  je->CallStaticVoidMethod(jclazz, targetMethodId, arr, strLen);
}
.h файл:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <jni.h>
/* Header for class com */
 
#ifndef _Included_com
#define _Included_com
#ifdef __cplusplus
extern "C" {
#endif
 
/*
 * Class:     com
 * Method:    exp
 * Signature: ([C)I
 */
JNIEXPORT jint JNICALL Java_com_exp
  (JNIEnv *, jclass, jcharArray);
 
#ifdef __cplusplus
}
#endif
#endif
Java:
Java
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
import java.io.*;
import java.lang.*;
import java.util.*;
 
public class com 
{
   //Загрузка библиотеки
   static
   {
      try {
         String curDir = System.getProperty("user.dir"); 
         System.out.print("Load library............................");
         System.load(curDir + "/com.so");
         System.out.println("Done");
      }
      catch (UnsatisfiedLinkError e) {
         System.out.println("Fail");
         System.out.println(e); 
      }
   }
 
   public static char reply_arr[];
   public static native int exp(char[] cmd);
 
   //Передача массива из библиотеки в Java
   public static void callback(char data[], int length) {
      reply_arr = new char[length];
      reply_arr = data;
   }
 
   public static void main(String args[])
   {
      char[] chrArr = {'H', 'e', 'l', 'l', 'o', '!'};
      exp(chrArr);
      System.out.print("jchar = ");
      System.out.println(reply_arr);
   }
}
0 / 0 / 0
Регистрация: 12.06.2012
Сообщений: 27
21.10.2012, 20:56
Хороший и понятный пример. Спасибо!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.10.2012, 20:56
Помогаю со студенческими работами здесь

Туториал по Java + React Native
Добрый день! Есть ли туториал по Java + React Native ? И какие актуальные технологии для Java под Android есть еще? Например...

Исходный код native методов
Где посмотреть исходный код native методов из станд. библиотеки?

Компилятор Java в executable native code.
Привет всем! Вот нашел сегодня то что давно искал- Компилятор Java-классов в родной код для Windows-95/98/Me/2000/XP - как DLL, так...

java.lang.OutOfMemoryError: unable to create new native thread
При работе приложения (WebLogic8 SP1, Solaris8) после нескольких часов работы под большой нагрузкой, приложение падает с приведенным...

Один раз компилируй, потом запускай как native
У меня возникла не плохая идея. C++ это native. Java managed code. Java компилирует и запускает приложение в операционной системе...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru