2013-05-30 6 views
1

Я пытаюсь вызвать «public static void main (String [])» метод Java class kissdb.dev.Run из кода на C++. Я использую GCJ для компиляции:Как создать массив строк Java с 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(); 
    } 
} 

ответ

1

Вам нужно использовать функцию шаблона 'elements'.

elements(args)[i] = arg; 

См. Страницу «Массивы» в руководстве.

+0

Отлично, теперь это работает! Спасибо огромное! Я не использовал функции шаблона C++ в течение многих лет. Я видел руководство, но на самом деле не понял. –

+0

Теперь я могу освободить свою базу данных [kissdb.com] (http://kissdb.com/) для использования с GCJ. KissDB предназначен для простого, веселого и эффективного хранения программных объектов. –

+0

Мне пришлось переименовать мою базу данных в BergDB, [bergdb.com] (http://bergdb.com/). Теперь он работает с GCJ - пока не выпускает версию GCJ. –

0

Я не уверен на 100%, потому что я не уверен, как работает GCJ. Но массив args уже используется Java. Я думаю, что если вы используете другое имя для массива args, это должно сработать.

Редактировать: Теперь я прочитал ваше сообщение (изучая GCJ), я вижу, что вы пытаетесь сделать. Итак, мой ответ не совсем правильный.