2013-05-30 2 views
1

Java 클래스 kissdb.dev.Run의 "public static void main (String [])"메서드를 C++ 코드에서 호출하려고합니다. 나는 GCJ를 사용하여 컴파일한다 :GCJ로 Java String Array를 생성하는 방법은 무엇입니까?

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(args)[i] = arg; 

설명서의 "어레이"페이지를 참조하십시오.

+0

위대한 작품입니다. 정말 고맙습니다! 몇 년 동안 C++ 템플릿 함수를 사용하지 않았습니다. 매뉴얼을 보았지만 실제로 얻지는 못했습니다. –

+0

이제 GCJ에서도 사용할 수 있도록 데이터베이스 [kissdb.com] (http://kissdb.com/)를 공개 할 수 있습니다. KissDB는 소프트웨어 객체를 간단하고 재미 있고 효율적으로 저장하도록 설계되었습니다. –

+0

내 데이터베이스의 이름을 BergDB, [bergdb.com] (http://bergdb.com/)로 바꿔야했습니다. GCJ와 함께 작동하지만 아직 GCJ 버전을 공개하지 않았습니다. –

0

GCJ의 작동 방식을 잘 모르기 때문에 100 % 확실하지 않습니다. 그러나 args 배열은 이미 자바에 의해 취해진 다. args 배열에 다른 이름을 사용하면 작동해야한다고 생각합니다.

편집 : 이제 귀하의 게시물 (GCJ 배우기)을 읽었으므로 수행하려는 작업을 봅니다. 그래서, 내 대답은 정확하지 않습니다.

관련 문제