вызвать JAR файл из C ++ - как получить и отправить аргументы

0

У меня есть следующий код, который вызывает 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'); но это не помогло спасибо за помощь

  • 0
    Все, что вы хотите, это запустить программу Java? Не используйте JNI ...
  • 0
    Мне нужно отправить некоторые параметры в классе JAVA и получить один
Показать ещё 2 комментария
Теги:
jar
jni
jvm

2 ответа

2

Это не сработает:

 env->CallStaticVoidMethod(cls, meth, '56')

Есть несколько проблем с ним:

  1. Никакие методы Java не принимают литераловую строку, и JNI не конвертирует никакие литеральные строковые аргументы в аргументы метода Java для вас. Верно, что несколько JNI-функций принимают измененные строки UTF-8, но они работают с ограниченным набором строк, таких как подписи классов и методов, где мы полагаемся на кодировку конечного набора компилятора C++, имеющую те же значения, что и измененные UTF -8. (Java позволяет использовать любой символ валюты Юникода в идентификаторе, поэтому не все подписи могут использоваться таким образом, потому что измененная кодировка UTF-8 для некоторых символов валюты не соответствует какой-либо другой кодировке.)

  2. Ваш метод принимает единственный аргумент: String[]. Vararg/variadic версии JNI-функций являются удобством, поэтому вам не нужно создавать массив, содержащий все аргументы. Вам по-прежнему приходится передавать только один аргумент для каждого аргумента, который принимает ваш метод. В этом случае он должен быть jobjectArray, который был инициализирован с помощью jstring вы хотите передать в main.

  3. Вы, похоже, зависите от неявного преобразования из набора символов/кодировки на 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);
0

когда я использую функцию FindClass, если мой класс "hilla1" находится в папке пакета bi am writnig:

jclass mainClass = env->FindClass("a/src/b/hilla1"); 

?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню