Java and C++
От: Аноним  
Дата: 18.10.11 05:13
Оценка:
Здравствуйте господа !
Кто сталкивался с проблемой использование Java классов из программы на C++ ?
Может у кого то есть опыт такого взамодействия ?
Может даже примеры имеются?
Накопал я библиотеку JNI — как раз для таккого рода применения но там надо классы Java декомпилировать прописывать в нужные методы native и компилировать снова в последствии делать .h файл и обращаться к нужным методам JAVA из C++ .
Но проблема в том, что при декомпиляции получается охинея ... и потом бесплатной библиотеки JNI вроде бы нет везде trial.
А без декомпиляции использовать класс Java из С++ интересно можно ?
Спасибо.
Re: Java and C++
От: Аноним  
Дата: 18.10.11 07:12
Оценка:
Веб-сервисы или протокол типа Corba.
Re: Java and C++
От: Nicht Россия  
Дата: 18.10.11 07:16
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте господа !

А> Кто сталкивался с проблемой использование Java классов из программы на C++ ?
А> Может у кого то есть опыт такого взамодействия ?
А> Может даже примеры имеются?
А> Накопал я библиотеку JNI — как раз для таккого рода применения но там надо классы Java декомпилировать прописывать в нужные методы native и компилировать снова в последствии делать .h файл и обращаться к нужным методам JAVA из C++ .
А>Но проблема в том, что при декомпиляции получается охинея ... и потом бесплатной библиотеки JNI вроде бы нет везде trial.
А>А без декомпиляции использовать класс Java из С++ интересно можно ?
А>Спасибо.

Чего то ты все неправильно понял. Во первых JNI — это не библиотека а одна из основных частей jre. Вообще без JNI java и работать то не будет, так как JNI — это прослойка между джавой и нативной средой.
Native метод нужет тогда и только тогда когда ты хочешь реализовать java метод при помощи С.
Так же через JNI можно из нативнго языка дергаить java код. Ничего декомпилировать для этого не надо. Там даже можно embedded java машину создать, если хочешь. Для этого надо просто почитать документацию. Этого за тебя никто здесь делать не будет.
Re[2]: Java and C++
От: Blazkowicz Россия  
Дата: 18.10.11 08:50
Оценка:
Здравствуйте, Nicht, Вы писали:

N>Там даже можно embedded java машину создать, если хочешь.

На JNI ведь подругому никак.
Re[2]: Java and C++
От: Аноним  
Дата: 18.10.11 08:52
Оценка:
Здравствуйте, Nicht, Вы писали:

N>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте господа !

А>> Кто сталкивался с проблемой использование Java классов из программы на C++ ?
А>> Может у кого то есть опыт такого взамодействия ?
А>> Может даже примеры имеются?
А>> Накопал я библиотеку JNI — как раз для таккого рода применения но там надо классы Java декомпилировать прописывать в нужные методы native и компилировать снова в последствии делать .h файл и обращаться к нужным методам JAVA из C++ .
А>>Но проблема в том, что при декомпиляции получается охинея ... и потом бесплатной библиотеки JNI вроде бы нет везде trial.
А>>А без декомпиляции использовать класс Java из С++ интересно можно ?
А>>Спасибо.

N>Чего то ты все неправильно понял. Во первых JNI — это не библиотека а одна из основных частей jre. Вообще без JNI java и работать то не будет, так как JNI — это прослойка между джавой и нативной средой.

N>Native метод нужет тогда и только тогда когда ты хочешь реализовать java метод при помощи С.
N>Так же через JNI можно из нативнго языка дергаить java код. Ничего декомпилировать для этого не надо. Там даже можно embedded java машину создать, если хочешь. Для этого надо просто почитать документацию. Этого за тебя никто здесь делать не будет.


Это очень хорошо! Я с радостью ее почитаю и даже примеры подробно изучу только покажите мне такой пример в котором из сырца С++ можно напрямую дергать java класс без декомпиляции и прописывания у членов класса native префикс!
Re: Java and C++
От: Blazkowicz Россия  
Дата: 18.10.11 08:53
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Кто сталкивался с проблемой использование Java классов из программы на C++ ?

Нельзя просто вызвать любой попавшийся метод. Нужно сначала поднять JVM, чтобы она загрузила нужные Java классы. И потом уже дергать их методы.
http://www.codeproject.com/KB/cpp/CJniJava.aspx

Либо подымать Java сервер отдельным процессом и настраивать комуникацию по любому протоколу через сокеты.
Re[3]: Java and C++
От: Blazkowicz Россия  
Дата: 18.10.11 08:54
Оценка:
Здравствуйте, Аноним, Вы писали:

А> Это очень хорошо! Я с радостью ее почитаю и даже примеры подробно изучу только покажите мне такой пример в котором из сырца С++ можно напрямую дергать java класс без декомпиляции и прописывания у членов класса native префикс!

Документация по JNI, в основном, показывает как вызывать нативные методы из Java. Вам это не нужно. Гуглите по запросу call Java from C++
Re[3]: Java and C++
От: viklequick  
Дата: 18.10.11 10:22
Оценка: 3 (1)
> Это очень хорошо! Я с радостью ее почитаю и даже примеры подробно изучу
> только покажите мне такой пример в котором из сырца С++ можно напрямую
> дергать java класс без декомпиляции и прописывания у членов класса
> native префикс!

Создаем жавамашину у себя в плюсах

#include <jni.h>

JavaVMInitArgs vm_args;
vm_args.version = JNI_VERSION_1_6; // 1_4 for MacOS
JavaVMOption options[4];
options[0].optionString = "-Xmx512M"; // Java heap size
options[1].optionString = "-classpath /my/path/to/jar";
options[2].optionString = "-Djava.awt.headless=true"; // MacOS X only
options[3].optionString = "-XstartOnFirstThread"; // MacOS X only

vm_args.options=options;
vm_args.nOptions = sizeeof(options)/sizeof(options[0]);
vm_args.ignoreUnrecognized = JNI_TRUE;

JNIEnv* jEnv;
JavaVM* vm;

jint createRes = JNI_CreateJavaVM(&vm, (void**)&jEnv, &vm_args);
if(createRes != JNI_OK) // кривые руки, исправляем параметры

Все, машина создана и из плюсов к ней можно ходить.

Допустим, у нас в жаве есть такое

package my.cool.pkg;

public class Name {
public static void ourMethod(int x, int y, OutputStream out){}
}

И мы с этим всем будем работать — просто вызовем.

Перво-наперво, надо наш плюсовый тред приаттачить к жаве. А то мнного
чего отвалится.

JNIEnv* env;
JavaVMAttachArgs args;
args.version = JNI_VERSION_1_6; // 1_4 for MacOS;
args.name = NULL;
args.group = NULL;

vm->AttachCurrentThread((void**)&env, &args);


Теперь можно вызвать

bool status = false;
jthrowable exc;
jobject stream = NULL;
jstring refstr = NULL;
do
{
jclass ourJavaClass = env->FindClass("Lmy/cool/pkg/Name;");
if(ourJavaClass == NULL) break;

jmethodID ourMethod = env->GetStaticMethodID(
ourJavaClass, "ourMethod",
"(IILjava/io/OutputStreamV");

if(ourMethod == NULL) break;

метод нашли, теперь надо создать и передать параметры

jclass streamClass =
env->FindClass("Ljava/io/FileOutputStream;");
if(streamClass == NULL) break;

jmethodID constructor = env->GetMethodID(
streamClass, "<init>",
"(Ljava/lang/StringV");

if(constructor == NULL) break;
refstr = env->NewStringUTF("MyKewlFileName");
stream = env->NewObject(streamClass, constructor, refstr);
if(stream == NULL) break;

собственно вызов

env->CallStaticVoidMethod(ourJavaClass,

ourMethod, 100, 200, stream);

}while(false);

обработка ексепшенов

exc = env->ExceptionOccurred();
if(exc) {
env->ExceptionDescribe();
env->ExceptionClear();
env->DeleteLocalRef(exc);
}

а теперь подчищаем все что насоздавали

if(refstr) env->DeleteLocalRef(refstr);
if(stream) env->DeleteLocalRef(stream);

Остальное раскуришь по аналогии.

В колнце перед выходом не забудь отдетачить все треды и разрушить
жавамашину (DestroyJavaVM).

Все это находится на офмфюыгтюсщь по ключевым словам, там же подробный
туториал — как с полями работать, с массивами, со строками и т д.
Posted via RSDN NNTP Server 2.1 beta
--
Viktor
Re[4]: Java and C++
От: viklequick  
Дата: 18.10.11 10:24
Оценка:
> Все это находится на офмфюыгтюсщь по ключевым словам, там же подробный
> туториал — как с полями работать, с массивами, со строками и т д.
> Posted via RSDN NNTP Server 2.1 beta

Опечатки меня погубят — java.sun.com.
Posted via RSDN NNTP Server 2.1 beta
--
Viktor
Re: Java and C++
От: _Obelisk_ Россия http://www.ibm.com
Дата: 29.10.11 11:46
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте господа !

А> Кто сталкивался с проблемой использование Java классов из программы на C++ ?
А> Может у кого то есть опыт такого взамодействия ?

А так уж ли необходимо вызывать Java классы из С++ ? Может лучше сделать это опосредовано — запустить отдельно Java-часть, отдельно С++ и пусть общаются, к примеру, через сокеты друг с другом. В примитивном варианте запускать Java-кусок как внешний процесс и давать ему параметры через коммандную строку а рез-т из файла или out-стрима считывать.



Душа обязана трудиться! (с) Н.Заболоцкий.
Re[2]: Java and C++
От: Antei США  
Дата: 31.10.11 22:30
Оценка:
Здравствуйте, _Obelisk_, Вы писали:

_O_>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте господа !

А>> Кто сталкивался с проблемой использование Java классов из программы на C++ ?
А>> Может у кого то есть опыт такого взамодействия ?

_O_>А так уж ли необходимо вызывать Java классы из С++ ? Может лучше сделать это опосредовано — запустить отдельно Java-часть, отдельно С++ и пусть общаются, к примеру, через сокеты друг с другом. В примитивном варианте запускать Java-кусок как внешний процесс и давать ему параметры через коммандную строку а рез-т из файла или out-стрима считывать.


Согласен. Использование в реальных задачах поднятой таким образом Java просто чтобы дёрнуть какой-то метод вызывает большие сомнения и кажется очень ненадёжным. По мне так общение через какой-нибудь простенький протокольчик через сокеты. Замена на Webservices тут — overkill.
Re[3]: Java and C++
От: viklequick  
Дата: 01.11.11 09:50
Оценка:
> А>> Может у кого то есть опыт такого взамодействия ?

Опыт — есть. Работает. Но граблей бывает богато. Вам под какую систему
про грабли рассказать?

> _O_>А так уж ли необходимо вызывать Java классы из С++ ? Может лучше

> сделать это опосредовано — запустить отдельно Java-часть, отдельно С++ и

и не всегда это возможно. Как правило там еще и обратная задача есть —
из жавы что-то в плюсах дергать и весьма активно. И чтобы не тормозило (Ц).
Posted via RSDN NNTP Server 2.1 beta
--
Viktor
Re: Java and C++
От: Аноним  
Дата: 02.11.11 12:28
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте господа !

А> Кто сталкивался с проблемой использование Java классов из программы на C++ ?
А> Может у кого то есть опыт такого взамодействия ?
А> Может даже примеры имеются?
http://chabster.blogspot.com/2008/01/jvm-hosting.html
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.