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

时间:2013-12-28 20:24:08

标签: java c++ jar jvm java-native-interface

我有下一个从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'); 但它没有用 谢谢你的帮助

2 个答案:

答案 0 :(得分:2)

这不起作用:

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

它有一些问题:

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

  2. 您的方法接受一个参数:String[]。 vNrg / variadic版本的JNI函数非常方便,因此您无需创建包含所有参数的数组。您仍然必须为您的方法所采用的每个参数传递一个参数。在这种情况下,它应该是jobjectArray已使用您要传递给jstring的{​​{1}}进行初始化。

  3. 您似乎依赖于从本机字符集/编码到Java的Unicode / UTF-16编码的隐式转换。你可以这样做,但你必须使用正确的main构造函数。您必须明确知道您使用的字符串的字符集和编码,或者它是JVM知道的操作系统默认值。

  4. 您可以从原生字符串创建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");