我有下一个从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");
}
}
我尝试发送一些args: env-&gt; CallStaticVoidMethod(cls,meth,'56'); 但它没有用 谢谢你的帮助
答案 0 :(得分:2)
这不起作用:
env->CallStaticVoidMethod(cls, meth, '56')
它有一些问题:
没有Java方法接受文字字符串,JNI不会为您将任何文字字符串参数转换为Java方法参数。确实,有几个JNI函数接受修改过的UTF-8 字符串,但是它们在一组有限的字符串上运行,例如类和方法签名,我们依赖于C ++编译器的目标字符集编码。与修改的UTF-8相同的值。 (Java允许在标识符中使用任何Unicode货币字符,因此并非所有签名都可以这种方式使用,因为某些货币字符的修改后的UTF-8编码与任何其他编码都不匹配。)
您的方法接受一个参数:String[]
。 vNrg / variadic版本的JNI函数非常方便,因此您无需创建包含所有参数的数组。您仍然必须为您的方法所采用的每个参数传递一个参数。在这种情况下,它应该是jobjectArray
已使用您要传递给jstring
的{{1}}进行初始化。
您似乎依赖于从本机字符集/编码到Java的Unicode / UTF-16编码的隐式转换。你可以这样做,但你必须使用正确的main
构造函数。您必须明确知道您使用的字符串的字符集和编码,或者它是JVM知道的操作系统默认值。
您可以从原生字符串创建java.lang.String
。 STL String[]
是保存本地字符串的各种方法之一。
vector<string>
要从本机字符串转换为vector<string> programArgs;
programArgs.push_back("one");
programArgs.push_back("two");
programArgs.push_back("three");
,您可以使用操作系统默认字符集和编码来利用java.lang.String
构造函数。
String(byte[])
答案 1 :(得分:0)
当我使用FindClass函数时 如果我的班级“hilla1”位于文件夹b我正在写的文件:
jclass mainClass = env->FindClass("a/src/b/hilla1");