Я пытаюсь вызвать «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();
}
}
Отлично, теперь это работает! Спасибо огромное! Я не использовал функции шаблона C++ в течение многих лет. Я видел руководство, но на самом деле не понял. –
Теперь я могу освободить свою базу данных [kissdb.com] (http://kissdb.com/) для использования с GCJ. KissDB предназначен для простого, веселого и эффективного хранения программных объектов. –
Мне пришлось переименовать мою базу данных в BergDB, [bergdb.com] (http://bergdb.com/). Теперь он работает с GCJ - пока не выпускает версию GCJ. –