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