gpt4 book ai didi

java - 从 C++ 调用 jar 文件-如何获取和发送 args

转载 作者:行者123 更新时间:2023-11-28 03:01:10 29 4
gpt4 key购买 nike

我有下一个从 C++ 调用 jar 文件的代码

// 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 文件中发送和获取 args 我该怎么做?

我的java代码是:

public class hilla1 {

public static void main(String[] args) {
System.out.println("hello");


}

}

我尝试通过以下方式发送一些参数: env->CallStaticVoidMethod(cls, meth, '56');但它没有用谢谢你的帮助

最佳答案

这行不通:

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

它有一些问题:

  1. 没有任何 Java 方法接受文字字符串,并且 JNI 不会为您将任何文字字符串参数转换为 Java 方法参数。确实有几个 JNI 函数接受修改后的 UTF-8 字符串,但它们对一组有限的字符串进行操作,例如类和方法签名,我们依赖于 C++ 编译器的目标字符集编码具有与修改后的 UTF-8 相同的值。 (Java 允许在标识符中使用任何 Unicode 货币字符,因此并非所有签名都可以以这种方式使用,因为某些货币字符的修改后的 UTF-8 编码与任何其他编码都不匹配。)

    <
  2. 您的方法接受一个参数:String[] . JNI 函数的 vararg/variadic 版本很方便,因此您不必创建包含所有参数的数组。您仍然必须为您的方法采用的每个参数传递一个参数。在这种情况下,它应该是 jobjectArray已使用 jstring 初始化你想传递给 main .

  3. 您似乎依赖于从 native 字符集/编码到 Java 的 Unicode/UTF-16 编码的隐式转换。你可以做到这一点,但你必须使用正确的 java.lang.String构造函数。您始终必须知道您使用的字符串的字符集和编码,无论是明确的还是 JVM 所知道的操作系统默认值。

您可以创建自己的 String[]来自 native 字符串。 STL vector<string>是保存原生字符串的多种方式之一。

vector<string> programArgs;
programArgs.push_back("one");
programArgs.push_back("two");
programArgs.push_back("three");

从 native 字符串转换为 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);

关于java - 从 C++ 调用 jar 文件-如何获取和发送 args,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20819004/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com