Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

JNI Invocation API

122  
Simple Nothing is f*cked22.11.06 09:45
Simple
NEW 22.11.06 09:45 
Кто-нить уже пользовался сабжем? http://java.sun.com/j2se/1.5.0/docs/guide/jni/spec/invocation.html#wp9502
#1 
  scorpi_ nobody22.11.06 10:41
NEW 22.11.06 10:41 
в ответ Simple 22.11.06 09:45
Я пользовался. Весьма интенсивно. В смысле вызова явы из С++
#2 
Simple Nothing is f*cked22.11.06 10:45
Simple
NEW 22.11.06 10:45 
в ответ scorpi_ 22.11.06 10:41
У меня такая же задача. KBV теперь пишет Prüfmodule и Kryptomodul на джаве, черт бы их побрал. До сих пор вызывались через ShellExecute.
Какие-нить проблемы были?
#3 
  scorpi_ nobody22.11.06 11:06
NEW 22.11.06 11:06 
в ответ Simple 22.11.06 10:45
Ну пришлось пару классов нацарапать (JArray, JClass, JString, JVM, JObject) и затем для каждого Java-класса С++-класс генерить, после чего всё straightforward
#4 
Simple Nothing is f*cked22.11.06 11:10
Simple
NEW 22.11.06 11:10 
в ответ scorpi_ 22.11.06 11:06
Зачем? Они же все определены в jni.h?
#5 
  scorpi_ nobody22.11.06 11:23
NEW 22.11.06 11:23 
в ответ Simple 22.11.06 11:10, Последний раз изменено 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;
}


#6 
Simple Nothing is f*cked22.11.06 11:30
Simple
NEW 22.11.06 11:30 
в ответ scorpi_ 22.11.06 11:23
Хм, пожалуй, ничего :)
Спасибо.
#7 
Simple Nothing is f*cked23.11.06 17:59
Simple
NEW 23.11.06 17:59 
в ответ scorpi_ 22.11.06 10:41
Нарисовал примерчик в консоли, работает без проблем. Перенес его в дллку, которая запускается из нашей системы - крэш без всяких объяснений :( Хрен его знает.
#8 
Murr коренной житель23.11.06 18:16
Murr
NEW 23.11.06 18:16 
в ответ Simple 23.11.06 17:59
Dll-ка скорее всего грузится как отдельная задача...
#9 
Simple Nothing is f*cked23.11.06 18:23
Simple
NEW 23.11.06 18:23 
в ответ Murr 23.11.06 18:16
Какая разница?
#10 
Murr коренной житель23.11.06 19:15
Murr
NEW 23.11.06 19:15 
в ответ Simple 23.11.06 18:23
Отдельная область памяти. и немогЁшь ссылаться на другую.
Общие переменные, параметры - все по боку...
#11 
Simple Nothing is f*cked23.11.06 20:16
Simple
NEW 23.11.06 20:16 
в ответ Murr 23.11.06 19:15
Я загружаю ВМ из самой длл, при чем тут отдельная область памяти?
#12 
  scorpi_ nobody23.11.06 20:22
NEW 23.11.06 20:22 
в ответ Simple 23.11.06 17:59
Код большой? Покажи основные моменты
#13 
Simple Nothing is f*cked23.11.06 20:31
Simple
NEW 23.11.06 20:31 
в ответ scorpi_ 23.11.06 20:22
Код практически из туториала. Типа такого: http://www.inonit.com/cygwin/jni/invocationApi/launch.html
ВМ загружается, класс находится. Когда запускаю main - прога по-тихому умирает.
#14 
  scorpi_ nobody23.11.06 20:38
NEW 23.11.06 20:38 
в ответ 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" );
}


#15 
Simple Nothing is f*cked23.11.06 20:52
Simple
23.11.06 20:52 
в ответ scorpi_ 23.11.06 20:38
По сути то же самое, только длл загружается динамически. Я статически линкую.
Другая проблема: у нас в системе уже используется ВМ. Если она загружена, то мне свою уже не загрузить :) Вроде бы известный баг.
#16 
  scorpi_ nobody23.11.06 21:06
NEW 23.11.06 21:06 
в ответ Simple 23.11.06 20:52
Дело в том, что я LoadLibrary не без причины заюзал. Вот только причину я уже не помню, ибо давно это было.
Что значит в системе? Через LoadLibrary ты даже в одной программе можешь разные vm юзать
#17 
Simple Nothing is f*cked23.11.06 21:33
Simple
NEW 23.11.06 21:33 
в ответ scorpi_ 23.11.06 21:06
Возможно, что причина крэша именно в этом. Где-то в сети я видел совет загружать длл динамически.
#18 
Simple Nothing is f*cked24.11.06 11:51
Simple
NEW 24.11.06 11:51 
в ответ scorpi_ 23.11.06 21:06
Падает все равно, но причина, как выяснилось, не в моем коде, а в джавовской проге.
#19