我有从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文件中发送和获取参数,我该怎么做呢?
我的java代码是:
public class hilla1 {
public static void main(String[] args) {
System.out.println("hello");
}
}我尝试通过: env->CallStaticVoidMethod(cls,meth,‘56’)发送一些参数;但它不起作用,谢谢你的帮助
发布于 2013-12-30 10:07:21
这是行不通的:
env->CallStaticVoidMethod(cls, meth, '56')它有几个问题:
JNI不接受文字字符串,并且不会为您将任何文字字符串参数转换为
String[]。JNI函数的vararg/variadic版本非常方便,因此您不必创建包含所有参数的数组。您仍然需要为您的方法接受的每个参数传递一个参数。在这种情况下,它应该是一个已经用您想要传递给main.jobjectArray初始化的jstring,它看起来依赖于从本地字符集/编码到Java/UTF-16编码的隐式转换。您可以这样做,但您必须使用正确的java.lang.String构造函数。您必须始终知道所使用的字符集和字符串编码,或者显式知道,或者知道它是JVM所知道的OS-default。您可以从原生字符串创建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);发布于 2014-01-07 19:58:03
当我使用函数FindClass时,如果我的类"hilla1“位于a包b文件夹中,我正在写:
jclass mainClass = env->FindClass("a/src/b/hilla1"); https://stackoverflow.com/questions/20819004
复制相似问题