我的程序用到了jni
详细说一下
先用几个替代字母:
A:PB程序
B:VC做的DLL
C:JAVA类我用B调用C,用A调用B,第一次在A中调用B时正常,第二次调用就出错,而且是系统级内存不能读的错误,A程序崩溃,重起A再运行还是同样结果。这是怎么回事呢?是不是B中启动的虚拟机出的问题?
详细说一下
先用几个替代字母:
A:PB程序
B:VC做的DLL
C:JAVA类我用B调用C,用A调用B,第一次在A中调用B时正常,第二次调用就出错,而且是系统级内存不能读的错误,A程序崩溃,重起A再运行还是同样结果。这是怎么回事呢?是不是B中启动的虚拟机出的问题?
解决方案 »
- java.lang.NoClassDefFoundError: mainwindow/MainWindows Exception in thread "main
- java 调用.net应用程序的问题????
- 关于多线程的问题
- 请教一个算法:计算N项的Fibonacci数列的和,其中第N项是数列中最大的不超过4百万的数
- equals的问题
- 面试题:解析C:\TEST\\ADMINISTRATOR\\3\\C:\TEST\TEMP\T2_TEMP.TXT\\SUPPORT\\2\\一个字符串
- java String类中的format方法是怎么实现的?
- 路过的大侠请来看看
- 在JB里,不同的工程中怎么引用用户自己定义的包或类啊?
- 求救:下面的程序错在哪!!!分必给!!
- LINUX JAVA乱码!
- 希望各位高手特别是wlmmlw(吴铭)近来一下,谢谢
下面是我在C++ exe中的代码,看看有没有参考作用
jint create_jvm(JNIEnv **penv,JavaVM **pjvm)
{
CComCritSecLock<CComAutoCriticalSection> cs(g_cs);
//return 0 if success
THREAD_SPEC static JNIEnv* static_env = NULL;
static JavaVM* static_jvm = NULL;
jint res = JNI_OK;
if( static_env && static_jvm)
{
*pjvm = static_jvm;
*penv = static_env;
AtlTrace(_T("%s return at %d,thread id:%d"),__TFUNCTION__,__LINE__,GetCurrentThreadId());
return res;
}
CRegKey reg;
long lret = reg.Open(HKEY_LOCAL_MACHINE,reg_key_path,KEY_READ);
TCHAR jar_dir[PATH_LEN];
std::basic_string<TCHAR> jar_base_dir;
if(ERROR_SUCCESS==lret)
{
ULONG usize = sizeof(jar_dir)/sizeof(jar_dir[0]);
lret = reg.QueryStringValue("jar_dir",jar_dir,&usize);
if(lret!=ERROR_SUCCESS||usize<=0 || usize>=sizeof(jar_dir)/sizeof(jar_dir[0]))
{
}
else
{
jar_base_dir = jar_dir;
if(jar_base_dir.length()>0 && end_with(jar_base_dir,_T("\\"))==false)
jar_base_dir += _T("\\");
} }
reg.Close();
if(jar_base_dir.length()<1)
jar_base_dir = get_app_dir();
LPCTSTR jar_files[] = {
_T("activation.jar"),
_T("mail.jar"),
_T("JDAVMail.0.9.006.jar"),
_T("mailapi.jar"),
_T("smtp.jar"),
_T("commons-httpclient-2.0-final.jar"),
_T("commons-logging.jar"),
_T("jdom.jar"),
};
char chBuf[4096];
memset(chBuf,0,sizeof(chBuf));
std::string jarfiles;
std::string missingfile;
{
for(int i=0;i < sizeof(jar_files)/sizeof(jar_files[0]);i++)
{
std::string filename = jar_base_dir +jar_files[i];
if(DoesFileExist(filename.c_str())==FALSE)
{
missingfile += filename;
missingfile += ",\n";
}
jarfiles += jar_base_dir;
jarfiles += jar_files[i];
jarfiles += _T(";");
}
}
if(missingfile.length()>0)
{
missingfile = std::string("missing the following files:\n") + missingfile;
missingfile += "\ncan set registry:";
missingfile += reg_key_path;
missingfile += " jar_dir ";
AfxMessageBox(missingfile.c_str());
}
SetEnvironmentVariableA( _T("CLASSPATH"),jarfiles.c_str());
if(static_jvm)
{
*pjvm = static_jvm;
res = static_jvm->AttachCurrentThread( (void**)&static_env,NULL);
*penv = static_env;
AtlTrace(_T("%s attach thread %d return %d"),__TFUNCTION__,GetCurrentThreadId(),res);
return res;
}
//HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
std::basic_string<TCHAR> cls_path;
cls_path += _T("-Djava.class.path=");
cls_path += jarfiles;
char buf[PATH_LEN+4096];
memset(buf,0,sizeof(buf));
int buf_length = sizeof(buf)/sizeof(buf[0]);
StringCchPrintfA(buf, sizeof(buf)/sizeof(buf[0]),cls_path.c_str());
AtlTrace(buf);
if(jvm_manager.m_jvm_exist)
{
JavaVMInitArgs vm_args;
JavaVMOption options[2];
options[0].optionString = buf;
options[0].extraInfo = NULL;
options[1].optionString = "vfprintf";
options[1].extraInfo = Log;
vm_args.version = JNI_VERSION_1_4;
vm_args.options = options;
vm_args.nOptions = sizeof(options)/sizeof(options[0]);
vm_args.ignoreUnrecognized = JNI_FALSE;
res = JNI_CreateJavaVM(pjvm, (void**)penv, &vm_args);
static_env = *penv;
static_jvm = *pjvm;
return res;
}
else
return JNI_ERR;
}