★★★★★对JNI熟悉的朋友请进来,请教一个在C++中调用Java的方法★★★★★

linuxyf 2008-11-17 10:33:49
问题描述如下:
一个Java类(Test.java),带有Main方法,在该类中还有一个静态变量和一个修改该变量的静态方法。部分相关代码如下:
private static long focus = 0; //静态变量
//修改focus的方法
public static long GetIntMethod(int m) {
focus = focus + m;
return focus;
}

在启动Test应用后(java.exe Test.class),该Java应用程序会驻留内存,不会结束。那么在Java应用程序运行期间,如何在C++中通过JNI调用得到当前运行的虚拟机实例,得到Test实例,并调用上面的静态方法,GetIntMethod,修改并返回focus变量的值?

哪位高手能给点建议??
...全文
168 点赞 收藏 15
写回复
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
spearhead1 2008-12-01
关注!
回复
cjmiou 2008-11-18
不熟
帮顶了
回复
goodmrning 2008-11-18
学习
回复
danielzhan 2008-11-18
如果在DLL想取得一个Java class的实例,并通过这个实例调用Java的Methods.
可以在一个Java class先call一个JNI的function,从而在DLL端取得此Java class的实例.
例如在Java端,class test.MyFunctions 有Methods: public void function1() 和 public void callback(int iv, String str)
在DLL端我们就可以写
jmethodID jmd;

JNIEXPORT jint JNICALL Java_test_MyFunctions_function1(JNIEnv * JNI, jobject obj)
{
.....
if(JNI)
{
jclass java_class = JNI->GetObjectClass(obj);
jmd= JNI->GetMethodID(java_class,"callback", "(ILjava/lang/String;)V");
//取static Method,调用GetStaticMethodID
}
.....
}

保留jmd,在需要call method "callback"的时候运行JNI->CallVoidMethod(obj, jmd, paramInt, parameStr);

参考面的链接,相信会很有帮助的.
http://journals.ecs.soton.ac.uk/java/tutorial/native1.1/implementing/method.html
回复
pauliuyou 2008-11-18
可以用消息队列通信,但是想得到Test实例,不太可能. 首先必须在C++环境中也定义同样的类型(C++语法的) 然后再根据通信得到的数据,在C++环境里本地创建一个对象. 直接用JAVA的对象好象不可以啊. java和java间是可以实现的.但是C++有些难
回复
pauliuyou 2008-11-18
消息队列
回复
linuxyf 2008-11-18
后面的几位兄弟没有明白我的意思啊
回复
danielzhan 2008-11-18
把DLL和Java project一起打包.
在Java class里调用
static {
try{
System.loadLibrary("XXXXX");
}catch(Exception e){}
}
可以把DLL也载入VM,这样Java classes和DLL都在一个进程中,就可以互相调用了.
回复
joynet007 2008-11-18
JNI
是可以用 java 调用dll 的动态链接库哦!

c++ 也可以通过 jni 反过来调用java 么?

还是xml 吧!!通用
回复
kokobox 2008-11-17
c++调用java,没这样试过。我是用socket来实现的。 c++请求,socket返回xml给他

或者可以直接用ws


回复
FairLu 2008-11-17
mark
回复
tiyuzhongxin789 2008-11-17
c++调用java,没这样试过。我是用socket来实现的。 c++请求,socket返回xml给他

或者可以直接用ws
回复
renmms 2008-11-17
关注
回复
badlove3 2008-11-17
帮顶了~~~~~~~~~。。,
回复
TinyJimmy 2008-11-17
直接调用不可能,哪怕是C++与C++程序之间. 进程之间数据交换可以通过管道,消息,socket,文件,数据库等等
回复
发动态
发帖子
Java SE
创建于2007-09-28

6.1w+

社区成员

Java 2 Standard Edition
申请成为版主
社区公告
暂无公告