java用JNI调用C程序,此刻被启动的C程序能利用JNI调用java代码吗?Code(java) -> Code(C) -> Code(java)

解决方案 »

  1.   

    没明白你得意思
    jni (java native interface)
     可以用c调用java
    也可以用java调用c
      

  2.   

    用JAVA调用C代码,但是这个被调用的C代码中也调用JAVA
    因为在编译过程中出错误,所以不确定这样的调用形式是否被JAVA支持。
      

  3.   

    这是可以的贴上你java调用c的代码
    和c的代码
    邦你看看不过个人认为这是没有必要的
    即时你要用jni技术也没有必要让其中的c代码再次调用java代码
    对你得移植性和维护性都不是很好
    一个java程序只有用到native方法(特殊平台提供的特殊interface)的时候才会去做jni
      

  4.   

    目前是想移植一个项目的C代码,但只是部分采用JAVA代码,所以出现了这种情况
    以下是一个例子程序,public class JavaMain{
       System.loadLibrary("clib.dll");   public native void test();   public void javafunction(){
            System.out.println("hello");
       }   public static void main(String[] args){
            new JavaMain().test();       
       }
    }
    以上为java代码。调用clib.dll。JNIEXPORT void JNICALL java_test(JNIEnv * env, jobject obj)
    {
          startThread();
    }void startThread()
    {
          jclass class_JavaMain;
          jmethodID javafunc;
          int returnvalue = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
          class_javaMain = (*env)->FindClass(env, "JavaMain");
          javafunc = (*env)->GetMethodId(env,..);
          (*env)->CallMethod("javafunction",...);
    }
    以上为C代码。编译成clib.dll。并且clib.dll会随时调用JavaMain的方法。程序由JavaMain开始运行,调用c编写的动态库,在c动态库中运行的代码会随时回调类JavaMain中的方法。编译都没问题,但把LOG打印出来后,发现startThread()中的 returnvalue 值是-1,表示JNI_CreateJavaVM的返回结果是错误,并没有成功创建虚拟机。
      

  5.   

    startThread() 是另外一个模块的函数,在内部需要自己创建一个新的JNI_CreateJavaVM,不能使用java_test(JNIEnv * env, jobject obj)中传入的JNIEnv * env
      

  6.   

    to zt9788(zt)
    你有办法解决这个问题吗?
      

  7.   

    看看在C中的PATH中,是否有 JAVA的执行路径。
      

  8.   

    > 看看在C中的PATH中,是否有 JAVA的执行路径。
    没问题,C中有JAVA的路径不知道这样的调用方式是否被JNI支持?