Manish Sharma Ответов: 1

Вызов методов Java из C/C++


Мне нужно вызвать некоторые методы Java с помощью C/C++, а затем мне нужно использовать DPI в UVM или system verilog для вызова методов C. У меня нет доступа к файлам JAVA или классам JAVA. У меня есть файл .jar, в котором присутствует мой класс, к которому мне нужно получить доступ.

Я использую путь этого .файл jar в

options.optionString = "-Djava.class.path= путь к файлу .jar

Я могу найти класс с помощью
clsH = env->FindClass("com/act/testdev/pa5/PA5");

Но я не могу получить идентификатор метода. Я знаю только имя метода в классе java, который является булевым методом с булевыми аргументами
com.act.testdev.pa5.PA5.aes_encrypt(key_data, pt_data);

Этот метод используется в каком-то другом языке, и вот его код:
boolean[] aes_encrypt(boolean key_data[], boolean pt_data[]) 
{
    return com.act.testdev.pa5.PA5.aes_encrypt(key_data, pt_data);
}


Вот код, который я пытаюсь использовать, чтобы получить methodID:
if (clsH != NULL)
{
    //midMain       = env->GetMethodID(clsH, "<init>", "([Z[Z)[Z");    
    midMain       = env->GetMethodID(clsH, "aes_encrypt", "([Z[Z)[Z"); 
    printf("\n FOUND able to find the requested class midMain ==%x ==%x\n",midMain,clsH);       
}
else
{
    printf("\nUnable to find the requested class\n");       
}

if (midMain != NULL)
{
    //jstring StringArg = env->NewStringUTF("\nTestCall:Called from the C Program\n");
    printf("\nable to find the requested Method\n");        
    jbooleanArray BoolArg1 = env->NewBooleanArray(128);
    jbooleanArray BoolArg2 = env->NewBooleanArray(128);
    env->CallBooleanMethod(clsH,midMain,BoolArg1,BoolArg2);
    //env->CallStaticVoidMethod(clsH, midMain, NULL); //Calling the main method.
    //env->CallBooleanMethod(clsH, midMain, BoolArg); //Calling the main method.
}

Пожалуйста, помогите мне в этом, как я могу получить доступ к этому методу в c/c++. есть еще несколько методов, которые мне нужно вызвать таким же образом, как только я смогу вызвать это, я попробую их позже. Я не имею никакого представления о JAVA, я получил этот код онлайн в качестве примера того, как вызывать методы java из c/c++.


Что я уже пробовал:

Я создал а CTest.cpp файл, в котором я только что дал путь к файлу .jar, который имеет классы java. и я просто использую эту команду для выполнения файла .cpp

г++ -я/мягкая/УО/jdk1.8.0_11/включить-я/мягкая/УО/jdk1.8.0_11/числе/Линукс -л/мягкие/УО/jdk1.8.0_11/среда jre/lib В/архитектуры AMD64/сервер -ljvm CTest.cpp

1 Ответов

Рейтинг:
2

KarstenK

Обычно JNI работает, и вы пропустили некоторые детали. Прочитать статью Вызов Java из C++ с помощью JNI в которой используется JNI, как я работал с ним.

Убедитесь, что пакеты, классы и функции являются общедоступными.

Наконец вы можете попробовать делать свою работу на Java и только экспорт результаты в виде простых данных, таких как строки или числа.


Manish Sharma

clsH = env->FindClass("com/act/testdev/pa5/PA5");clsH1=env->FindClass("com/gate/sam/Samlet$BooleanArray");если (clsH1 != Значение null){функции printf("\N нашел в состоянии найти запрошенные класс ==%х \п",clsH1);}еще{функции printf("\nUnable найти требуемый класса\П");}если (clsH != Значение null){midinit=ОКР-&ГТ;GetMethodID(clsH, "в<инициализации и GT;", "(III и[я)в");midMain =ОКР-&ГТ;GetMethodID(clsH, "aes_encrypt", "([Lcom/gate/sam/Samlet$BooleanArray;[Lcom/gate/sam/Samlet$BooleanArray;)[Lcom/gate/sam/Samlet$BooleanArray");printf("\Н найден в состоянии найти запрошенные midMain класс ==%=Х=%х\п",midMain,clsH); }

в этом коде удалось найти метод <init> класса PA5, но все еще не удалось найти метод aes_encrypt. Я обнаружил, что для логического массива существует еще один класс. Поэтому я попытался связать этот calss в Аргументах и возвращаемом типе, но он все еще не работает. Я могу найти класс boolean array в дескрипторе cIsH1.