1

C++コードからJavaクラスkissdb.dev.Runの「public static void main(String[])」メソッドを呼び出そうとしています。GCJ を使用してコンパイルします。

c++ -c run.cpp; gcj run.o kissdb.so -lstdc++ -o run.x

ただし、以下のコードはコンパイルされません。コンパイラは次のように述べています。

run.cpp: In function ‘int main(int, char**)’:
run.cpp:52:23: error: no match for ‘operator=’ in ‘*(args + ((unsigned int)(((unsigned int)i) * 8u))) = arg’

何をすべきか?私のC++コード:

#include <gcj/cni.h>
#include <java/lang/System.h>
#include <java/io/PrintStream.h>
#include <java/lang/Throwable.h>

#include <iostream>
#include "pub.h"

java::lang::String* js(const char* s) {
    return JvNewStringLatin1(s);
}

int main(int argc, char *argv[]) {   
    using namespace std;                // For cout <<
    using namespace java::lang;         // For System::class, Throwable

    try {
        JvCreateJavaVM(NULL);
        JvAttachCurrentThread(NULL, NULL);

        cout << "* Hello from GCJ! argc: " << argc << endl;

        JArray<String *> *args = 
            (JArray<String *> *) JvNewObjectArray(argc, &String::class$, NULL);
                // From http://gcc.gnu.org/onlinedocs/gcj/Arrays.html#Arrays

        for (int i = 0; i < argc; i++) {
            String* arg = JvNewStringLatin1(argv[i]);
            args[i] = arg;               // <---  ERROR HERE
        }

        kissdb::dev::Run::main(args);    // The Java main method I want to run.

        JvDetachCurrentThread();
    } catch (Throwable *t) {
         System::out->println(js("Unhandled Java exception:"));
         t->printStackTrace();
    }
}
4

2 に答える 2

1

「要素」テンプレート機能を使用する必要があります。

elements(args)[i] = arg;

マニュアルの「アレイ」ページを参照してください。

于 2013-06-04T13:31:46.103 に答える
0

GCJ がどのように機能するかがわからないため、100% 確実ではありません。しかし、args 配列は Java によって既に取得されています。args 配列に別の名前を使用すると、それが機能するはずだと思います。

編集:今、私はあなたの投稿(GCJの学習)を読みました。あなたがやろうとしていることがわかります。したがって、私の答えは完全に正しいわけではありません。

于 2013-05-30T14:00:59.103 に答える