Здравствуйте, Аноним, Вы писали:
А>Кто сталкивался с проблемой использование Java классов из программы на C++ ?
Нельзя просто вызвать любой попавшийся метод. Нужно сначала поднять JVM, чтобы она загрузила нужные Java классы. И потом уже дергать их методы.
http://www.codeproject.com/KB/cpp/CJniJava.aspx
Либо подымать Java сервер отдельным процессом и настраивать комуникацию по любому протоколу через сокеты.
> Это очень хорошо! Я с радостью ее почитаю и даже примеры подробно изучу
> только покажите мне такой пример в котором из сырца С++ можно напрямую
> дергать 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/OutputStream

V");
if(ourMethod == NULL) break;
метод нашли, теперь надо создать и передать параметры
jclass streamClass =
env->FindClass("Ljava/io/FileOutputStream;");
if(streamClass == NULL) break;
jmethodID constructor = env->GetMethodID(
streamClass, "<init>",
"(Ljava/lang/String

V");
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
> Все это находится на офмфюыгтюсщь по ключевым словам, там же подробный
> туториал — как с полями работать, с массивами, со строками и т д.
> Posted via RSDN NNTP Server 2.1 beta
Опечатки меня погубят — java.sun.com.
Posted via RSDN NNTP Server 2.1 beta
> А>> Может у кого то есть опыт такого взамодействия ?
Опыт — есть. Работает. Но граблей бывает богато. Вам под какую систему
про грабли рассказать?
> _O_>А так уж ли необходимо вызывать Java классы из С++ ? Может лучше
> сделать это опосредовано — запустить отдельно Java-часть, отдельно С++ и
и не всегда это возможно. Как правило там еще и обратная задача есть —
из жавы что-то в плюсах дергать и весьма активно. И чтобы не тормозило (Ц).
Posted via RSDN NNTP Server 2.1 beta