Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
Reiji Cross
28 / 28 / 4
Регистрация: 14.05.2010
Сообщений: 57
#1

Native функции

01.05.2011, 18:39. Просмотров 1222. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.05.2011, 18:39
Ответы с готовыми решениями:

Native java
Мне стало интересно вот что. Говорят есть такие методы, нативные, например...

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

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

(очередной раз) Java код в native (машинный) код
Возможно тема довольно баянистая, но все же подниму ее. Вопрос тот же - как...

К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й...

2
the_Leo
0 / 0 / 1
Регистрация: 15.05.2011
Сообщений: 1
18.05.2011, 21:10 #2
Лучший ответ Сообщение было отмечено 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
GagarinSokol
0 / 0 / 0
Регистрация: 12.06.2012
Сообщений: 27
21.10.2012, 20:56 #3
Хороший и понятный пример. Спасибо!!!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.10.2012, 20:56

Компилятор Java в executable native code.
Привет всем! Вот нашел сегодня то что давно искал- Компилятор Java-классов...

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

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru