java返回重新执行,在调用DestroyJavaVM之后,重新调用JNI_CreateJavaVM会返回-1

I am trying to recall JNI_CreateJavaVM after calling DestroyJavaVM.

I call them in following order: InitJVM -> ReleaseJVM -> InitJVM

First time when initialing, JNI_CreateJavaVM returns 0 and works fine.

second time when initialing after destroying, JNI_CreateJavaVM return -1 and does not work.

What would be the problem?

Here is a function that create JVM:

#elif __linux

HRESULT PWNJava::InitJVM(void) {

if(m_bRunning) {

Log("Error : JVM is already Running! (PWNJava::Init)");

return PWN_FAIL;

}

const int kNumOptions = 3;

JavaVMOption options[kNumOptions] = {

{ const_cast ("-Xmx128m"), NULL},

{ const_cast ("-verbose:gc"), NULL},

{ const_cast ("-Djava.class.path=../../Class"), NULL}

};

JavaVMInitArgs vm_args;

vm_args.version = JNI_VERSION_1_6;

vm_args.options = options;

vm_args.nOptions = sizeof (options) / sizeof (JavaVMOption);

assert(vm_args.nOptions == kNumOptions);

int res = JNI_CreateJavaVM(&jvm, reinterpret_cast (&env), &vm_args);

if (res != JNI_OK) {

Log("Error : createJavaVM(&jvm, &env, &vm_args)");

return PWN_FAIL;

}

m_bRunning = true;

Log("Success : PWNJava::Init");

return PWN_OK;

}

#endif

Here is a function deleting JVM:

void PWNJava::ReleaseJVM(void) {

if (jvm)

jvm->DestroyJavaVM();

jvm = NULL;

delete jvm;

env = NULL;

delete env;

m_bRunning = false;

Log("Success : PWNJava::ReleaseJVM");

}

解决方案

Last time I looked at JNI_DestroyJVM(), it said "The JDK/JRE still does not support VM unloading, however." Just don't call it, and don't re-initialize it either.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在ASP.NET中调用Java文件需要使用JNIJava Native Interface)技术。以下是调用Java文件的步骤: 1. 在ASP.NET项目中添加对Java SDK的引用。 2. 在ASP.NET项目中创建一个C#类,该类将用于加载Java类和调用Java方法。您可以使用“System.Runtime.InteropServices.DllImport”特性来加载Java类。 3. 在ASP.NET项目中创建一个Java类,该类将包含要调用的方法。 4. 在Java类中实现要调用的方法。 5. 在ASP.NET中实例化Java类并调用Java方法。 以下是一个简单的示例: 1. 创建一个Java类: ```java public class HelloWorld { public static String getHelloWorld() { return "Hello World!"; } } ``` 2. 在ASP.NET项目中创建一个C#类: ```csharp using System.Runtime.InteropServices; public class JavaBridge { [DllImport("jvm.dll")] private static extern IntPtr JNI_CreateJavaVM(out IntPtr pvm, out IntPtr penv, IntPtr args); [DllImport("jvm.dll")] private static extern int JNI_GetCreatedJavaVMs(out IntPtr ppJavaVMs, int bufsize, out int nVMs); [DllImport("jvm.dll")] private static extern int JNI_GetDefaultJavaVMInitArgs(IntPtr args); [DllImport("jvm.dll")] private static extern int JNI_GetCreatedJavaVMs(out IntPtr ppJavaVMs, int bufsize, out int nVMs); [DllImport("jvm.dll")] private static extern int JNI_DestroyJavaVM(IntPtr jvm); private static IntPtr jvm; static JavaBridge() { IntPtr pvm, penv; JNI_CreateJavaVM(out pvm, out penv, IntPtr.Zero); jvm = pvm; } public static string HelloWorld() { IntPtr env; jvm.AttachCurrentThread(out env, IntPtr.Zero); IntPtr cls = env.FindClass("HelloWorld"); IntPtr mid = env.GetStaticMethodID(cls, "getHelloWorld", "()Ljava/lang/String;"); IntPtr jstr = env.CallStaticObjectMethod(cls, mid); string result = Marshal.PtrToStringAnsi(env.GetStringChars(jstr, IntPtr.Zero)); env.ReleaseStringChars(jstr, IntPtr.Zero); return result; } } ``` 3. 在ASP.NET中调用Java方法: ```csharp string result = JavaBridge.HelloWorld(); ``` 这将返回字符串“Hello World!”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值