Re[3]: jni. Чтение в C++ методе поля вложенного java объекта
От: Jakop Россия https://wmspanel.com
Дата: 22.12.09 12:12
Оценка: 1 (1)
Здравствуйте, 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;
}


В общем что угодно можно делать. Люблю я это дело
https://wmspanel.com/nimble — Nimble Streamer media server for live and VOD HLS, RTMP, HTTP streaming

https://wmspanel.com/ — Control and reporting panel for Wowza and Nimble Streamer
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.