4

JNI を使用して C++ コードから Java 関数を呼び出すプログラムを作成しています。ファイルを直接使用するとプログラムは正常に動作しますが.class、jar ファイルに追加するとFindClass失敗します。たとえば、これはうまくいきます

    std::string stdOpt = "-Djava.class.path=<path_to_jar>/dependency.jar;<path_to_class>";

    boost::scoped_array<char> opt(new char[stdOpt.size() + 1]);
    std::copy(stdOpt.begin(), stdOpt.end(), opt.get());
    opt[stdOpt.size()] = '\0';
    options[0].optionString = opt.get();

    JavaVMInitArgs vm_args;
    memset(&vm_args, 0, sizeof(vm_args));
    vm_args.version = JNI_VERSION_1_6;
    vm_args.nOptions = 1;
    vm_args.options = options;
    long status = JNI_CreateJavaVM(&m_pJavaVirtualMachine, (void**)&m_pJavaEnvironment, &vm_args);
    if (status != JNI_OK)
        throw std::logic_error("Cannot start Java Virtual Machine");

    m_class = m_pJavaEnvironment->FindClass("MyClass");
    if(m_class == 0)
        throw std::logic_error("Cannot find Java class");

しかし、これは失敗します

    std::string stdOpt = "-Djava.class.path=<path_to_jar>/dependency.jar;<path_to_jar>/myjar.jar";

    boost::scoped_array<char> opt(new char[stdOpt.size() + 1]);
    std::copy(stdOpt.begin(), stdOpt.end(), opt.get());
    opt[stdOpt.size()] = '\0';
    options[0].optionString = opt.get();

    JavaVMInitArgs vm_args;
    memset(&vm_args, 0, sizeof(vm_args));
    vm_args.version = JNI_VERSION_1_6;
    vm_args.nOptions = 1;
    vm_args.options = options;
    long status = JNI_CreateJavaVM(&m_pJavaVirtualMachine, (void**)&m_pJavaEnvironment, &vm_args);
    if (status != JNI_OK)
        throw std::logic_error("Cannot start Java Virtual Machine");

    m_class = m_pJavaEnvironment->FindClass("MyClass");    //m_class=NULL
    if(m_class == 0)
        throw std::logic_error("Cannot find Java class");  //throwing exception 

からJavaクラスを取得しようとしているときにすべき違いはあります.jarか? どうしたの?何か案は?

4

2 に答える 2

5

クラスがパッケージ内にある場合は、クラス パスではなく、FindClass の呼び出しにパッケージを含めます。

 m_class = m_pJavaEnvironment->FindClass( "com/mycompany/mypackage/MyClass" );
于 2013-08-13T15:09:19.633 に答える
3

その問題はコードにはないことが判明しました。コードは問題ありません。.jarファイルの作成に問題がありました。私は Visual Studio を使用しており、自動コンパイル.javaと、ビルド前のイベントをプロジェクトに追加したファイルへの追加に使用.class.classています。.jarしたがって、.jarファイルを作成する前に、このように現在のディレクトリを指定する必要があります

cd "<_directory_where_.class_file_is_located>"

jar cf myjar.jar MyClass.class

それ以外の場合、絶対パスのフォルダーを含むファイルMyClass.classに追加され、失敗しました。.jarFindClass()

于 2013-08-14T09:34:52.900 に答える