У меня есть следующий код, который вызывает jar файл из c++
// helloworld.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <strsafe.h>
#include <stdexcpt.h>
#include "jni.h"
#include <conio.h>
#include <Windows.h>
using namespace std;
#pragma comment (lib,"C:\\Users\\Hilla\\Documents\\Visual Studio 2012\\helloworld\\helloworld\\jvm.lib")
int main()
{
JavaVM *jvm;
JNIEnv *env;
JavaVMInitArgs vm_args;
JavaVMOption options;
options.optionString="-Djava.class.path=hilla.jar";
vm_args.version=JNI_VERSION_1_6;
vm_args.nOptions=1;
vm_args.options=&options;
vm_args.ignoreUnrecognized=0;
int ret=JNI_CreateJavaVM(&jvm,(void**)&env,&vm_args);
jclass cls=env->FindClass("hilla1");
jmethodID meth = env->GetStaticMethodID(cls, "main", "([Ljava/lang/String;)V");
env->CallStaticVoidMethod(cls, meth, 0);
int a;
cin>>a;
return ret;
}
Я хочу отправить и получить аргументы из файла jar, как я могу это сделать?
мой код Java:
public class hilla1 {
public static void main(String[] args) {
System.out.println("hello");
}
}
Я пытаюсь отправить некоторые аргументы: env-> CallStaticVoidMethod (cls, meth, '56'); но это не помогло спасибо за помощь
Это не сработает:
env->CallStaticVoidMethod(cls, meth, '56')
Есть несколько проблем с ним:
Никакие методы Java не принимают литераловую строку, и JNI не конвертирует никакие литеральные строковые аргументы в аргументы метода Java для вас. Верно, что несколько JNI-функций принимают измененные строки UTF-8, но они работают с ограниченным набором строк, таких как подписи классов и методов, где мы полагаемся на кодировку конечного набора компилятора C++, имеющую те же значения, что и измененные UTF -8. (Java позволяет использовать любой символ валюты Юникода в идентификаторе, поэтому не все подписи могут использоваться таким образом, потому что измененная кодировка UTF-8 для некоторых символов валюты не соответствует какой-либо другой кодировке.)
Ваш метод принимает единственный аргумент: String[]
. Vararg/variadic версии JNI-функций являются удобством, поэтому вам не нужно создавать массив, содержащий все аргументы. Вам по-прежнему приходится передавать только один аргумент для каждого аргумента, который принимает ваш метод. В этом случае он должен быть jobjectArray
, который был инициализирован с помощью jstring
вы хотите передать в main
.
Вы, похоже, зависите от неявного преобразования из набора символов/кодировки на Java Unicode/UTF-16. Вы можете это сделать, но вам нужно использовать правый конструктор java.lang.String
. Вы всегда должны знать набор символов и кодировку строк, которые вы используете, либо явно, либо то, что JVM знает как ОС по умолчанию.
Вы можете создать свою String[]
из родных строк. vector<string>
STL vector<string>
является одним из способов сохранения собственных строк.
vector<string> programArgs;
programArgs.push_back("one");
programArgs.push_back("two");
programArgs.push_back("three");
Чтобы преобразовать из родных строк в java.lang.String
, вы можете использовать конструктор String(byte[])
используя набор символов и кодировку по умолчанию для ОС.
jclass stringClass = env->FindClass("java/lang/String");
jmethodID stringCtor = env->GetMethodID(stringClass, "<init>", "([B)V");
int argsCount = programArgs.size();
jobjectArray mainArgs = (jobjectArray) env->NewObjectArray(
argsCount,
stringClass,
nullptr);
for (int i = 0; i < argsCount; i++) {
string programArg = programArgs[i];
int length = programArg.length();
jbyteArray argBytes = env->NewByteArray(length);
env->SetByteArrayRegion(
argBytes,
0,
length,
reinterpret_cast<const jbyte *>(programArg.data()));
jstring argString = reinterpret_cast<jstring>(
env->NewObject(stringClass, stringCtor, argBytes));
env->SetObjectArrayElement(mainArgs, i, argString);
}
jclass mainClass = env->FindClass("hilla1");
jmethodID mainMethod = env->GetStaticMethodID(
mainClass,
"main",
"([Ljava/lang/String;)V");
env->CallStaticVoidMethod(mainClass, mainMethod, mainArgs);
когда я использую функцию FindClass, если мой класс "hilla1" находится в папке пакета bi am writnig:
jclass mainClass = env->FindClass("a/src/b/hilla1");
?