2012-01-24 10 views
8

私は、JavaコードがJNIを通じてC++コードを呼び出すことができることを知っています。しかし、JavaコードをJNIや他の方法でC++から呼び出すことは可能ですか?C++がJavaコードを呼び出すことはできますか?

+14

を公開するためにC++コードの多くを持っているとき、それは私がダンブルドアは、私は彼がもので、ウィザードの聞くプログラミング:) –

+4

を気に入って知りませんでした非常に便利です! – Luminously

+10

@Luminously彼のコードを見ました。それは魔法です。 – mcfinnigan

答えて

10

もちろん可能です。ここでは例です:

public class InvocationHelloWorld { 
    public static void main(String[] args) { 
     System.out.println("Hello, World!"); 
     System.out.println("Arguments sent to this program:"); 
     if (args.length == 0) { 
      System.out.println("(None)"); 
     } else { 
      for (int i=0; i<args.length; i++) { 
       System.out.print(args[i] + " "); 
      } 
      System.out.println(); 
     } 
    } 
} 

そしてHERESにそれを使用するいくつかのC++:

void invoke_class(JNIEnv* env) { 
    jclass helloWorldClass; 
    jmethodID mainMethod; 
    jobjectArray applicationArgs; 
    jstring applicationArg0; 

    helloWorldClass = (env)->FindClass("InvocationHelloWorld"); 
    if(! helloWorldClass) 
    { 
    std::cerr<<"Couldn't get \"InvocationHelloWorld\""<<std::endl; 
    return; 
    } 

    mainMethod = (env)->GetStaticMethodID(helloWorldClass, "main", "([Ljava/lang/String;)V"); 
    if(! mainMethod) 
    { 
    std::cerr<<"Coulnd't get \"InvocationHelloWorld::main\""<<std::endl; 
    return; 
    } 

    applicationArgs = (env)->NewObjectArray(1, (env)->FindClass("java/lang/String"), NULL); 
    applicationArg0 = (env)->NewStringUTF("From-C-program"); 
    (env)->SetObjectArrayElement(applicationArgs, 0, applicationArg0); 

    (env)->CallStaticVoidMethod(helloWorldClass, mainMethod, applicationArgs); 
} 
+0

完璧、ありがとう:-) –

4

ます。また、自動的にJNIファイルを生成するためにSWIGを使用することができます

ここではjavaファイルです。セットアップは少し注意が必要ですが、あなたは

http://www.swig.org/index.php

関連する問題