ACCES冲突异常

我有一个调用C DLL又调用java的DLL(使用内置喷射精益求精第三方程序)C#程序。 我传递一个XML字符串从C#到Java,然后在java返回字符串到C#的处理。

这适用于第一次迭代,但随后在第二次迭代,我得到以下异常...

试图读取或写入受保护的内存。 这通常是指示其他内存已损坏。

这里是什么我会类的相关代码,但如果你需要任何东西,请让我知道。

C#调用到C DLL

public static class DllCall { [DllImport("Stubs", CallingConvention = CallingConvention.Cdecl)] public static extern int initDll([MarshalAs(UnmanagedType.LPStr)] string userDllName); [DllImport("Stubs", CallingConvention = CallingConvention.Cdecl)] public static extern void finalizeDll(); [DllImport("Stubs", CallingConvention = CallingConvention.Cdecl)] public static extern UInt32 newClassInstance(String rootPath, String cfgPath, String logPath ); [DllImport("Stubs", CallingConvention = CallingConvention.Cdecl)] public static extern String request(UInt32 hClassInst, [MarshalAs(UnmanagedType.LPStr)] String input); [DllImport("Stubs", CallingConvention = CallingConvention.Cdecl)] public static extern void close(); }

在C DLL所引发错误方法

const char* request(jobject obj, char* input ) { jstring inputString; jstring outputString; const char *nativeString; jmethodID mID = (*env)->GetMethodID (env, jClass, "request", "(Ljava/lang/String;)Ljava/lang/String;"); if (!mID){ printf("\nError: dllClass.request() not found\n"); return 0; } inputString = (*env)->NewStringUTF(env, input); outputString = (*env)->CallObjectMethod(env, obj, mID, inputString); nativeString = (*env)->GetStringUTFChars(env, outputString, 0); return nativeString; }

由于这里要求的是,实际上导致异常的C#代码。

public string request(string xmlInput) { LogManager.logMessage("Sending request to Java. Request is - " + xmlInput); string rs =""; Console.Write("Making request"); //this works fine rs = DllCall.request(hClass, xmlInput); Console.Write("---> request() rs = {0}\n", rs); // this throws the error rs = DllCall.request(hClass, "<?xml version='1.0' encoding='utf-8'?><moo><request name=\"Panel.Open.GetSelectionTemplate\"/></moo>"); return rs; }

在回应丹尼尔这里是ENV声明

#include <jni.h> #include <windows.h> JNIEnv *env; JavaVM *jvm; HANDLE hUserDll; jclass jClass; char* dllname;

这里是它是如何初始化。

int initDll(char* userDllName) { jClass = NULL; hUserDll = loadDll(userDllName); dllname = userDllName; initJavaRT(hUserDll, &jvm, &env); jClass = lookForClass(env, "XActMain/XActGeminiX3/XActGeminiX3IFX"); return jClass ? 1 : 0; } /* * Initialize JET run-time. */ void initJavaRT(HANDLE myDllHandle, JavaVM** pjvm, JNIEnv** penv) { int result; JavaVMInitArgs args; JNI_GetDefaultJavaVMInitArgs_func = (jint (JNICALL *) (void *args)) GetProcAddress (myDllHandle, "JNI_GetDefaultJavaVMInitArgs"); JNI_CreateJavaVM_func = (jint (JNICALL *) (JavaVM **pvm, void **penv, void *args)) GetProcAddress (myDllHandle, "JNI_CreateJavaVM"); if(!JNI_GetDefaultJavaVMInitArgs_func) { printf ("%s doesn't contain public JNI_GetDefaultJavaVMInitArgs\n", dllname); exit (1); } if(!JNI_CreateJavaVM_func) { printf ("%s doesn't contain public JNI_CreateJavaVM\n", dllname); exit (1); } memset (&args, 0, sizeof(args)); args.version = JNI_VERSION_1_2; result = JNI_GetDefaultJavaVMInitArgs_func(&args); if (result != JNI_OK) { printf ("JNI_GetDefaultJavaVMInitArgs() failed with result %d\n", result); exit(1); } /* * NOTE: no JVM is actually created * this call to JNI_CreateJavaVM is intended for JET RT initialization */ result = JNI_CreateJavaVM_func (pjvm, (void **)penv, &args); if (result != JNI_OK) { printf ("JNI_CreateJavaVM() failed with result %d\n", result); exit(1); } printf ("JET RT initialized\n"); fflush (stdout); }

这是在回应有关初始化乔斯评论...

public class Test { public UInt32 hClass; public Test() { initDll(); newClassInstance(rootConfig, config, logFile); } ........ public void newClassInstance(string rootPath, string cfgPath, string logPath) { hClass = DllCall.newClassInstance(rootPath, cfgPath, logPath); Console.Write("---> hClass = {0}\n", hClass); } public void initDll() { int rc = DllCall.initDll("dllClass.dll"); Console.Write("---> initDll() rc = {0}\n", rc); }

汉斯指出以下链接潜在的答案

不过,我不知道如何修改我当前的代码以适应这一解决方案。

会有人能够发布使用特定于我的情况有些代码示例答案吗?

正如我说这一次的作品崩溃,然后在第二次迭代..

任何帮助将不胜感激。

--------------解决方案-------------

我不知道为什么它的工作是第一次,但你传递一个类对象( hClass )到request ,而不是这个类的一个实例。

rs = DllCall.request(hClass, xmlInput); //The error is thrown on this line

看看这能解决问题:

public string request(string xmlInput)
{
LogManager.logMessage("Sending request to Java. Request is - " + xmlInput);
string rs ="";
Console.Write("Making request");

UInt32 hClassInst = DllCall.newClassInstance(rootPath, cfgPath, logPath); // <-- New line, using your own rootPath, cfgPath, logPath variables
rs = DllCall.request(hClassInst, xmlInput); // <-- Modified line, using hClassInst instead of hClass

Console.Write("---> request() rs = {0}\n", rs);
return rs;
}

如果这能解决问题,你应该再重构,并拔出newClassInstance呼叫到一个较早的初始化方法。

分类:C# 时间:2012-01-01 人气:0
本文关键词: JNI
分享到:

相关文章

  • 创建JNI一个简单的dll文件 2012-01-01

    我试着去创建一个简单的DLL file.Im以下教程 http://java.sun.com/docs/books/jni/html/start.html 当我尝试编译C程序我得到以下错误: 警告W8057的helloworld.c 10:参数"ENV"是从未使用过的功能Java_He lloWorld_print警告W8057的helloworld.c 10:参数"OBJ"是从来没有的功能Java_He lloWorld_print使用 即时通讯使用Borland

  • 抛出异常时,Java的JNI遇到分段错误 2012-01-07

    我们已运行的代码JNI在单独的线程. 我们偶尔会分割故障而发展中国家,我们需要调试,但由于代码是在一个单独的线程中运行赛格故障不报. 相反,线程基本上没有死亡警告使得调试困难. 我希望能够要么检测段故障和/或当赛格故障发生时,使我们有一些迹象表明,一个线程已经毫无预兆死亡抛出异常. 有什么办法以这种方式来检测段错误? --------------解决方案------------- 在Windows中,使用SetUnhandledExceptionFilter或使用__try __except构建

  • 通过ColdFusion的JNI中访问DLL功能 2012-01-08

    我试图使用CreateObject内的ColdFusion函数通过JNI DLL中访问功能. 我已经成功地获得ColdFusion的使用java.lang.System.load函数来加载DLL OK,但我不知道如何然后访问包含在此方法中的功能. 我当前的代码: <cfset CreateObject("java","java.lang.System").load("C://Path//To//JniDll.dll")> <cf

  • 1003后的sqlite3查询C库比JNI崩溃 2012-01-08

    我正在写一个Java的SQLite库它采用C代码SQLITE3了JNI. 我觉得我有内存泄漏问题. 谁能帮我用我的审查代码,并告诉我,我需要释放什么吗? 这里是我的库: #include <jni.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include "sqlite3.h" #include "dynamicArray.h" voi

  • 如何播放音频使用JNI? 2012-01-09

    我已经做它有2个部分的应用程序: 1)它应该记录从Android应用程序层的声音,并通过JNI应的音频数据发送到C库. 2)C库处理该音频数据,并送其回其中处理后的音频歌曲播放应用层. 我知道如何使用录音机和音频轨道......但我就从应用层发送数据并发送回应用层有问题......如何音频数据字节发送到下层,然后retrive回来的字节?

  • 如何使用WINDOWS.H setClipboardContent方法在JNI调用? 2012-01-19

    我实现的JNI方法,它调用setClipboardContent()函数在WINDOWS.H中设置Windows剪贴板的内容. 标题看起来如下. 该formatName为剪贴板格式,数据是在Java中一个byte []. 这是你希望把剪贴板中的数据. 我很困惑如何在JNI方法调用setClipboardContent()函数. 任何人都可以帮忙吗? JNIEXPORT jboolean JNICALL Java_msoffice_MSOfficeClipboard_setClipboardCon

  • JNI静态库未能链接 2012-01-22

    我试图调试构建我的应用程序的C ++侧,当我得到一些链接错误. 该Android.mk如下所示: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := GLES LOCAL_SRC_FILES := ModelGLES.cpp RendererGLES.cpp LOCAL_LDLIBS := -llog -lGLESv1_CM LOCAL_LDFLAGS := -Wl,-Map,$(LOCAL_MODULE).map

  • JNI的问题:书面方式我自己的DLL桥 2012-01-23

    我书面方式我的桥DLL从Java调用第三方DLL. #include "jni.h" #include <stdio.h> #include <windows.h> #include "bridgeEpanet2.h" //#include "epanet2.h" typedef int (* FPTR)(char *, char *, char *, void (*) (char *)); typedef int (*

  • 从通过JNI加载的共享库中调用的dlopen使得先前加载无形的符号 2012-01-24

    我有一个使用JNI本机代码交互的Java应用程序. 本机代码编译的文件在运行时尝试使用的dlopen调用来加载此文件. 此调用失败,我得到一个警告,指出 Could not load library (x):(x) undefined symbol: y 然而,当我有开始通过JNI一个JVM上运行相同的代码的本地应用程序,则不会出现此错误,它运行正常. 我怀疑Java是做一些花哨这将导致已经加载库是一个被加载使用dlopen库中不可见. 这是我没有来诊断问题: 在确认共享库,据称是未定义使用位于

  • CoInitialize的恩是在JNI程序存根一个WMI调用内部失败 2012-01-24

    环境: 我有它是由以下几部分的JNI程序 C ++:在这里,我利用WMI的返回运行的进程的详细信息. 该程序类似于在http://msdn.microsoft.com/en-us/library/aa390423(v=vs.85).aspx我已包含在具有JNI封装的例子中的整个代码的例子(之一我发送给程序的参数的类型是整数). 下面是该函数的签名 JNIEXPORT jdouble JNICALL Java_handlemonitor_NativeSytem_getSystemDetails(J

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.140 (s). 10 q(s)