Здравствуйте, andrey_kon, Вы писали:
_>Здравствуйте, Jakop, Вы писали:
J>>Здравствуйте, TnedutS, Вы писали:
J>>[skipped]
J>>могу дать пример кода, который позволяет легко и просто дебажить подобные ситуации.
J>>Код создает instance java-машины, создает твой джава класс и может вызывать его методы. Учень удобно дебажить jni с таким подходом. Надо ?
_>Да, очень было бы полезно. У меня задача использовать в С++ программе Java классы (jar файлы стороннего производителя). Ваш код позволяет это сделать?
Да, я делаю это создавая instance java машины у себя в коде.
Вот для примера как можно создать java машыну и получить объект jclass.
Линковать нужно с jvm.lib. Инклуды и либы в папке с jdk.(см include, lib)
У меня подобный код в проекте осуществляет unit test и под windows и под linux.
#include "jni.h"
int main(int argc, char* args[])
{
JNIEnv *p_env;
JavaVM *p_vm;
JavaVMInitArgs arglist;
JavaVMOption options[1];
// тут у нас нужно указать библиотеки и их зависимости для отладки. У нашем пример допустим две // либы и одна зависит от другой. Под линуксом вместо ; нужно ставить : иначе работать не будет
options[0].optionString = "-Djava.class.path=C:\\project\\mylib1.jar;C:\\project\\mylib2.jar";
options[0].extraInfo = 0;
memset(&arglist, 0x0, sizeof(arglist));
// версия jre которая нужная
arglist.version = 0x00010006;
jint ret_val = JNI_GetDefaultJavaVMInitArgs(&arglist);
if(0 == ret_val)
{
arglist.nOptions = 1;
arglist.options = options;
// создаем java машыну. папка с должна быть в переменной PATH. Для отладки лучше использовать свойства в студии
jint ret = JNI_CreateJavaVM(&p_vm, (void**)&p_env, &arglist);
if(0 == ret)
{
// все клево машина создана
jclass YourClass = p_env->FindClass("yourpackage/YourClass");
if(YourClass)
{
// класс найден в jar-ах которые мы указали выше
// ну а далее пользуемся богатейшим api ява машыны для создания/удаления объектов, вызова их методов итд
// все эти бонусы доступны через p_env
// например
// создаем экземпляр java.lang.Strung
jstring subject = p_env->NewString((jchar*)L"hi", wcslen(L"hi"));
// получаем конструктор по умолчанию.
jmethodID constructor_id = p_env->GetMethodID(YourClass, "<init>", "()V");
jobject instance = m_env->NewObject(YourClass , constructor_id);
// Получаем дескриптор метода public void setName(String val);
jmethodID yourClassMethod = p_env->GetMethodID(YourClass, "setName", "(Ljava/lang/String;)V");
m_env->CallVoidMethod(instance , yourClassMethod, subject);
}
}
}
return 0;
}
В общем что угодно можно делать. Люблю я это дело