问题描述如下:
一个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变量的值?哪位高手能给点建议??
一个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变量的值?哪位高手能给点建议??
可以在一个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
是可以用 java 调用dll 的动态链接库哦!c++ 也可以通过 jni 反过来调用java 么?还是xml 吧!!通用
在Java class里调用
static {
try{
System.loadLibrary("XXXXX");
}catch(Exception e){}
}
可以把DLL也载入VM,这样Java classes和DLL都在一个进程中,就可以互相调用了.