2012-01-24 53 views
8

我知道Java代码可以通过JNI调用C++代码。但是,是否可以通过JNI或使用其他方法再次从C++调用Java代码?C++可以调用Java代码吗?

+14

我不知道邓布利多喜欢编程:) –

+4

我听到他在东西向导! – Luminously

+10

@我很高兴见过他的代码。它很神奇。 – mcfinnigan

回答

10

是的,你当然可以。这里有一个例子:

这里的java文件:

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(); 
     } 
    } 
} 

而且继承人一些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

完美,谢谢:-) –

相关问题