首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从c++调用jar文件-如何获取和发送args

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

Stack Overflow用户
提问于 2013-12-29 04:24:08
回答 2查看 653关注 0票数 0

我有从c++调用jar文件的下一段代码

代码语言:javascript
复制
// 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代码是:

代码语言:javascript
复制
public class hilla1 {

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


    }

}

我尝试通过: env->CallStaticVoidMethod(cls,meth,‘56’)发送一些参数;但它不起作用,谢谢你的帮助

EN

回答 2

Stack Overflow用户

发布于 2013-12-30 10:07:21

这是行不通的:

代码语言:javascript
复制
 env->CallStaticVoidMethod(cls, meth, '56')

它有几个问题:

JNI不接受文字字符串,并且不会为您将任何文字字符串参数转换为

  1. 方法参数。确实,有几个JNI函数接受修改后的UTF-8字符串,但它们只对有限的字符串集进行操作,比如类和方法签名,我们依赖于C++编译器的目标字符集编码,其值与修改后的UTF-8相同。(Java允许在标识符中使用任何Unicode货币字符,因此并不是所有的签名都可以这样使用,因为某些货币字符的修改后的UTF-8编码与任何其他编码都不匹配。)
  2. 您的方法只接受一个参数:String[]。JNI函数的vararg/variadic版本非常方便,因此您不必创建包含所有参数的数组。您仍然需要为您的方法接受的每个参数传递一个参数。在这种情况下,它应该是一个已经用您想要传递给main.
  3. You的jobjectArray初始化的jstring,它看起来依赖于从本地字符集/编码到Java/UTF-16编码的隐式转换。您可以这样做,但您必须使用正确的java.lang.String构造函数。您必须始终知道所使用的字符集和字符串编码,或者显式知道,或者知道它是JVM所知道的OS-default。

您可以从原生字符串创建String[]。STL vector<string>是保存本机字符串的多种方法之一。

代码语言:javascript
复制
vector<string> programArgs;
programArgs.push_back("one");
programArgs.push_back("two");
programArgs.push_back("three");

要将原生字符串转换为java.lang.String,您可以使用操作系统默认的字符集和编码来利用String(byte[])构造函数。

代码语言:javascript
复制
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);
票数 3
EN

Stack Overflow用户

发布于 2014-01-07 19:58:03

当我使用函数FindClass时,如果我的类"hilla1“位于a包b文件夹中,我正在写:

代码语言:javascript
复制
jclass mainClass = env->FindClass("a/src/b/hilla1"); 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20819004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档