Hi, 兄弟姐们:
  我这边有个Java应用,称之为A, 其链接了一个C语言写的协议库,称之为B吧,B要与远程进行通信;
   
  如果A要调用B提供的功能,这很简单,B只要暴露几个API给A调用就可以了。
  但是问题是,如果反过来,B某些时候要主动通知A去做某些事,那该怎么做呢?对Java不是很熟悉,求解啊!  万分感谢!!!

解决方案 »

  1.   

    既然你用java能够调到C的接口,那么应该使用了jni。
    jni也可以通过c来调用java的。
    只做过java调用c的,你还是搜搜看吧
      

  2.   

    我已经知道方法了,还是非常感谢楼上的参与。
    贴上方法:A.1.3 传递和使用Java对象
    在前例中,我们将一个字串传递给固有方法。事实上,亦可将自己创建的Java对象传递给固有方法。
    在我们的固有方法内部,可访问已收到的那些对象的字段及方法。
    为传递对象,声明固有方法时要采用原始的Java语法。如下例所示,MyJavaClass有一个public(公共)字段,以及一个public方法。UseObjects类声明了一个固有方法,用于接收MyJavaClass类的一个对象。为调查固有方法是否能控制自己的自变量,我们设置了自变量的public字段,调用固有方法,然后打印出public字段的值。class MyJavaClass {
      public void divByTwo() { aValue /= 2; }
      public int aValue;
    }public class UseObjects {
      public static void main(String [] args) {
        UseObjects app = new UseObjects();
        MyJavaClass anObj = new MyJavaClass();
        anObj.aValue = 2;
        app.changeObject(anObj);
        System.out.println("Java: " + anObj.aValue);
      }
      private native void 
      changeObject(MyJavaClass obj);
      static {
        System.loadLibrary("UseObjImpl");
      }
    }编译好代码,并将.class文件传递给javah后,就可以实现固有方法。在下面这个例子中,一旦取得字段和方法ID,就会通过JNI函数访问它们。JNIEXPORT void JNICALL
    Java_UseObjects_changeObject(
      JNIEnv * env, jobject jThis, jobject obj) {
      jclass cls;
      jfieldID fid;
      jmethodID mid;
      int value;
      cls = env->GetObjectClass(obj);
      fid = env->GetFieldID(cls,
            "aValue", "I");
      mid = env->GetMethodID(cls,
            "divByTwo", "()V");
      value = env->GetIntField(obj, fid);
      printf("Native: %d\n", value);
      env->SetIntField(obj, fid, 6);
      env->CallVoidMethod(obj, mid);
      value = env->GetIntField(obj, fid);
      printf("Native: %d\n", value);
    }