Login
JNI Invocation API
122
NEW 22.11.06 09:45
Кто-нить уже пользовался сабжем? http://java.sun.com/j2se/1.5.0/docs/guide/jni/spec/invocation.html#wp9502
NEW 22.11.06 10:41
in Antwort Simple 22.11.06 09:45
Я пользовался. Весьма интенсивно. В смысле вызова явы из С++
NEW 22.11.06 10:45
in Antwort scorpi_ 22.11.06 10:41
У меня такая же задача. KBV теперь пишет Prüfmodule и Kryptomodul на джаве, черт бы их побрал. До сих пор вызывались через ShellExecute.
Какие-нить проблемы были?
Какие-нить проблемы были?
NEW 22.11.06 11:06
in Antwort Simple 22.11.06 10:45
Ну пришлось пару классов нацарапать (JArray, JClass, JString, JVM, JObject) и затем для каждого Java-класса С++-класс генерить, после чего всё straightforward
NEW 22.11.06 11:23
in Antwort Simple 22.11.06 11:10, Zuletzt geändert 22.11.06 11:53 (scorpi_)
Чего там определено, вот это?
class _jstring : public _jobject {};
class _jarray : public _jobject {};
И что это тебе даёт?
Вот для примера, как будет выглядеть вызов функции через JNI (то, что у меня просто генерировалось):
В ответ на:
bool Collection::add( const Object& p0 )
{
JNIEnv* env = Jvm::get().getEnv();
static jmethodID this_method = 0;
if ( !this_method )
{
this_method = env->GetMethodID( this_class_.getClass(CLASS_NAME), "add", "(Ljava/lang/Object;)Z" );
if ( !this_method )
check_throw( env, "Method add in class Collection not found" );
}
bool result = env->CallBooleanMethod( jref_, this_method, p0.getJObjectValue() ) != 0;
check( env, "Method add in class Collection failed" );
return result;
}
NEW 23.11.06 17:59
in Antwort scorpi_ 22.11.06 10:41
Нарисовал примерчик в консоли, работает без проблем. Перенес его в дллку, которая запускается из нашей системы - крэш без всяких объяснений :( Хрен его знает.
NEW 23.11.06 18:16
in Antwort Simple 23.11.06 17:59
Dll-ка скорее всего грузится как отдельная задача...
NEW 23.11.06 19:15
in Antwort Simple 23.11.06 18:23
Отдельная область памяти. и немогЁшь ссылаться на другую.
Общие переменные, параметры - все по боку...
Общие переменные, параметры - все по боку...

NEW 23.11.06 20:16
in Antwort Murr 23.11.06 19:15
Я загружаю ВМ из самой длл, при чем тут отдельная область памяти?
NEW 23.11.06 20:31
in Antwort scorpi_ 23.11.06 20:22
Код практически из туториала. Типа такого: http://www.inonit.com/cygwin/jni/invocationApi/launch.html
ВМ загружается, класс находится. Когда запускаю main - прога по-тихому умирает.
ВМ загружается, класс находится. Когда запускаю main - прога по-тихому умирает.
NEW 23.11.06 20:38
in Antwort Simple 23.11.06 20:31
Я причин уже не помню, но у меня инициализационный код выглядел так -
void JVM::create()
{
library_handle_ = LoadLibrary( jvm_path_.c_str() );
if ( !library_handle_ )
throw ccm_error( std::string( "Can't load JVM from " + jvm_path_ ).c_str() );
createJavaVMPtr = (CreateJavaVM_t) GetProcAddress( library_handle_, "JNI_CreateJavaVM" );
if ( ! createJavaVMPtr )
throw ccm_error( std::string("Can't find JNI_CreateJavaVM in " + jvm_path_).c_str() );
env_ = 0;
JavaVMInitArgs vm_args;
JavaVMOption options[1];
std::string cl_path = "-Djava.class.path=" + class_path_;
options[0].optionString = const_cast<char*>( cl_path.c_str() );
vm_args.version = 0x00010002;
vm_args.options = options;
vm_args.nOptions = 1;
vm_args.ignoreUnrecognized = JNI_TRUE;
if ( createJavaVMPtr( &jvm_, reinterpret_cast<void**>(&env_), &vm_args ) < 0 )
throw ccm_error( "Cannot create JVM" );
if ( !env_ || !jvm_ )
throw ccm_error( "Cannot initialize JVM" );
}
23.11.06 20:52
in Antwort scorpi_ 23.11.06 20:38
По сути то же самое, только длл загружается динамически. Я статически линкую.
Другая проблема: у нас в системе уже используется ВМ. Если она загружена, то мне свою уже не загрузить :) Вроде бы известный баг.
Другая проблема: у нас в системе уже используется ВМ. Если она загружена, то мне свою уже не загрузить :) Вроде бы известный баг.
NEW 23.11.06 21:06
in Antwort Simple 23.11.06 20:52
Дело в том, что я LoadLibrary не без причины заюзал. Вот только причину я уже не помню, ибо давно это было.
Что значит в системе? Через LoadLibrary ты даже в одной программе можешь разные vm юзать
Что значит в системе? Через LoadLibrary ты даже в одной программе можешь разные vm юзать
NEW 23.11.06 21:33
in Antwort scorpi_ 23.11.06 21:06
Возможно, что причина крэша именно в этом. Где-то в сети я видел совет загружать длл динамически.
NEW 24.11.06 11:51
in Antwort scorpi_ 23.11.06 21:06
Падает все равно, но причина, как выяснилось, не в моем коде, а в джавовской проге.