Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用PInvoke函数';测试!DllCall::initDll';使堆栈不平衡_C#_Java Native Interface_Pinvoke - Fatal编程技术网

C# 调用PInvoke函数';测试!DllCall::initDll';使堆栈不平衡

C# 调用PInvoke函数';测试!DllCall::initDll';使堆栈不平衡,c#,java-native-interface,pinvoke,C#,Java Native Interface,Pinvoke,有点不寻常的问题 我发现只有在通过VisualStudio运行程序时才会抛出错误。如果我编译应用程序并运行编译后的程序,它就可以正常工作。你知道这是什么原因吗 我有一个C#类,它通过JNI调用Java DLL(通过excelsior jet编译)中的方法 当我编译并运行C#类作为可执行文件时,一切正常。现在我已经将C#类构建为DLL,并尝试从另一个类调用它 此时,我收到以下错误消息: 调用PInvoke函数“Test!”!DllCall::initDll'使堆栈不平衡。这可能是因为托管PInvo

有点不寻常的问题


我发现只有在通过VisualStudio运行程序时才会抛出错误。如果我编译应用程序并运行编译后的程序,它就可以正常工作。你知道这是什么原因吗

我有一个C#类,它通过JNI调用Java DLL(通过excelsior jet编译)中的方法

当我编译并运行C#类作为可执行文件时,一切正常。现在我已经将C#类构建为DLL,并尝试从另一个类调用它

此时,我收到以下错误消息: 调用PInvoke函数“Test!”!DllCall::initDll'使堆栈不平衡。这可能是因为托管PInvoke签名与非托管目标签名不匹配。检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配

有人能解释一下我为什么会得到这个以及如何修复它吗

如果您需要更多代码/信息,请告诉我

这是C代码:

我知道这是很多代码,但根据要求,这里是C Dll中的代码

#include <jni.h>
#include <windows.h>

JNIEnv  *env;
JavaVM  *jvm;
HANDLE  hUserDll;
jclass  jClass;
char*  dllname;

/*
 * Load dll.
 */
HANDLE loadDll(char* name)
{
    HANDLE hDll = LoadLibrary (name);

    if (!hDll) {
        printf ("Unable to load %s\n", name);
        exit(1);
    }

    printf ("%s loaded\n", name);

    return hDll;
}

jint (JNICALL * JNI_GetDefaultJavaVMInitArgs_func) (void *args);
jint (JNICALL * JNI_CreateJavaVM_func) (JavaVM **pvm, void **penv, void *args);



/*
 * 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);
}


/*
 * Look for class.
 */
jclass lookForClass (JNIEnv* env, char* name)
{
    jclass clazz = (*env)->FindClass (env, name);

    if (!clazz) {
        printf("Unable to find class %s\n", name);
        exit(1);
    }

    printf ("Class %s found\n", name);
    fflush (stdout);

    return clazz;
}


int initDll(char* userDllName) 
{
  jClass = NULL;
  hUserDll = loadDll(userDllName); 
  dllname = userDllName;
  initJavaRT(hUserDll, &jvm, &env); 
  jClass = lookForClass(env, "mooMain/mooGeminiX3/mooGeminiX3IFX");
  return jClass ? 1 : 0;
}

/** finalizeDll() - stop Java VM
 */
void finalizeDll ()
{
    (*jvm)->DestroyJavaVM (jvm);
    FreeLibrary((HMODULE)hUserDll);
    hUserDll = NULL;
    jClass   = NULL;
}


jobject newClassInstance()
{

    jmethodID MID_init;
    jobject obj;
    jstring name;
    jobjectArray ret;
    jclass sclass;
    jobjectArray arr;

    MID_init = (*env)->GetMethodID (env, jClass, "<init>", "([Ljava/lang/String;)V");
    if (!MID_init) {
        printf("Error: dllClass.<init>() not found\n");
        return NULL;
    }
    sclass = (*env)->FindClass(env, "java/lang/String");
    arr = (*env)->NewObjectArray(env, 6, sclass, NULL);


    name = (*env)->NewStringUTF(env,"@C:\\Users\\Ash\\Desktop\\moo-Test\\moo-Test\\mooRoot.cfg");
    (*env)->SetObjectArrayElement(env,arr,0,name);  
    name = (*env)->NewStringUTF(env,"-cfg");
    (*env)->SetObjectArrayElement(env,arr,1,name);
    name = (*env)->NewStringUTF(env,"C:\\Users\\Ash\\Desktop\\moo-CVS\\moo-PCB\\Application\\Configuration\\Linear\\Application\\moo.cfg");
    (*env)->SetObjectArrayElement(env,arr,2,name);
    name = (*env)->NewStringUTF(env,"-startupLog");
    (*env)->SetObjectArrayElement(env,arr,3,name);  
    name = (*env)->NewStringUTF(env,"C:\\Users\\Ash\\Desktop\\moo-Test\\moo-Test\\Log\\mooStartup.log"); 
    (*env)->SetObjectArrayElement(env,arr,4,name);
    name = (*env)->NewStringUTF(env,"-geminiX3"); 
    (*env)->SetObjectArrayElement(env,arr,5,name);












    obj = (*env)->NewObject(env, jClass, MID_init, arr);
    if (!obj) {
        printf("Error: failed to allocate an object\n");
        return NULL;
    }
    return obj;
}

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;
    }
    printf("here"); fflush(stdout);
    inputString = (*env)->NewStringUTF(env, input);
    printf("here2"); fflush(stdout);

    outputString = (*env)->CallObjectMethod(env, obj, mID, inputString);    

    nativeString = (*env)->GetStringUTFChars(env, outputString, 0); 


    return nativeString;
}

void voidtest(jobject obj )
{/*
    jmethodID mID = (*env)->GetMethodID (env, jClass, "request", "([Ljava/lang/String;)[Ljava/lang/String;");

    if (!mID){
        printf("\nError: dllClass.request() not found\n");
        return 0;
    }

    char inputString[] = (*env)->NewStringUTF(env, "Moo");

    (*env)->CallVoidMethod(env, obj, mID, inputString);*/
}   

void close()
{
    jmethodID mID = (*env)->GetMethodID (env, jClass, "close", "()V");
    if (!mID){
        printf("\nError: dllClass.close() not found\n");
    }

    (*env)->CallVoidMethod(env,jClass, mID);
}


int invokeStaticMethod()
{
    jmethodID MID_init;
    jobject obj;
    jstring name;
    jobjectArray ret;
    jclass sclass;
    jobjectArray arr;
    jmethodID mID = (*env)->GetStaticMethodID(env, jClass, "start", "([Ljava/lang/String;)V");

    if (!mID){
        printf("\nError: dllClass.sfstart() not found\n");
        return 0;
    }

    sclass = (*env)->FindClass(env, "java/lang/String");
    arr = (*env)->NewObjectArray(env, 5, sclass, NULL);


    name = (*env)->NewStringUTF(env,"@C:\\Users\\Ash\\Desktop\\moo-Test\\moo-Test\\mooRoot.cfg");
    (*env)->SetObjectArrayElement(env,arr,0,name);  
    name = (*env)->NewStringUTF(env,"-cfg");
    (*env)->SetObjectArrayElement(env,arr,1,name);
    name = (*env)->NewStringUTF(env,"C:\\Users\\Ash\\Desktop\\moo-CVS\\moo-PCB\\Application\\Configuration\\Linear\\Application\\moo.cfg");
    (*env)->SetObjectArrayElement(env,arr,2,name);
    name = (*env)->NewStringUTF(env,"-startupLog");
    (*env)->SetObjectArrayElement(env,arr,3,name);  
    name = (*env)->NewStringUTF(env,"C:\\Users\\Ash\\Desktop\\moo-Test\\moo-Test\\Log\\mooStartup.log"); 
    (*env)->SetObjectArrayElement(env,arr,4,name);



    (*env)->CallStaticVoidMethod(env,jClass, mID, arr);
    printf("\nGot to here\n");

    return 1;
}
#包括
#包括
JNIEnv*env;
JavaVM*jvm;
手摇滚轴;
jclass jclass;
char*dllname;
/*
*加载dll。
*/
句柄loadDll(字符*名称)
{
HANDLE hDll=LoadLibrary(名称);
如果(!hDll){
printf(“无法加载%s\n”,名称);
出口(1);
}
printf(“%s已加载\n”,名称);
返回hDll;
}
jint(JNICALL*JNI_GetDefaultJavaVMInitArgs_func)(void*args);
jint(JNICALL*JNI_CreateJavaVM_func)(JavaVM**pvm,void**penv,void*args);
/*
*初始化JET运行时。
*/
void initJavaRT(句柄myDllHandle、JavaVM**pjvm、JNIEnv**penv)
{
int结果;
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不包含公共JNI_GetDefaultJavaVMInitArgs\n”,dllname);
出口(1);
}
if(!JNI_CreateJavaVM_func){
printf(“%s不包含公共JNI\u CreateJavaVM\n”,dllname);
出口(1);
}
memset(&args,0,sizeof(args));
args.version=JNI_version_1_2;
结果=JNI_GetDefaultJavaVMInitArgs_func(&args);
如果(结果!=JNI_OK){
printf(“JNI_GetDefaultJavaVMInitArgs()失败,结果为%d\n”,结果为);
出口(1);
}
/*
*注意:实际上没有创建JVM
*此对JNI_CreateJavaVM的调用用于JET RT初始化
*/
结果=JNI_CreateJavaVM_func(pjvm,(void**)penv和args);
如果(结果!=JNI_OK){
printf(“JNI_CreateJavaVM()失败,结果为%d\n”,result);
出口(1);
}
printf(“JET RT已初始化\n”);
fflush(stdout);
}
/*
*找课。
*/
jclass lookForClass(JNIEnv*env,char*name)
{
jclass clazz=(*env)->FindClass(env,name);
如果(!clazz){
printf(“找不到类%s\n”,名称);
出口(1);
}
printf(“找到类%s\n”,名称);
fflush(stdout);
回击声;
}
int initDll(char*userDllName)
{
jClass=NULL;
huserdell=loadDll(userDllName);
dllname=userDllName;
initJavaRT(huserdell、jvm和env);
jClass=lookForClass(env,“mooMain/mooGeminiX3/mooGeminiX3IFX”);
返回jClass?1:0;
}
/**finalizeDll()-停止Java虚拟机
*/
void finalizeDll()
{
(*jvm)->破坏JavaVM(jvm);
FreeLibrary((HMODULE)Huserdell);
huserdl=NULL;
jClass=NULL;
}
jobject newClassInstance()
{
jmethodi MID_init;
jobject obj;
jstring名称;
jobject数组ret;
jclass-sclass;
jobjectarr;
MID_init=(*env)->GetMethodID(env,jClass,“,”([Ljava/lang/String;)V”);
如果(!MID_init){
printf(“错误:未找到dllClass.()\n”);
返回NULL;
}
sclass=(*env)->FindClass(env,“java/lang/String”);
arr=(*env)->NewObjectArray(env,6,sclass,NULL);
name=(*env)->NewStringUTF(env,“@C:\\Users\\Ash\\Desktop\\moo Test\\moo Test\\moooroot.cfg”);
(*env)->SetObjectArrayElement(env,arr,0,name);
name=(*env)->NewStringUTF(env,“-cfg”);
(*env)->SetObjectArrayElement(env,arr,1,name);
name=(*env)->NewStringUTF(env,“C:\\Users\\Ash\\Desktop\\moo CVS\\moo PCB\\Application\\Configuration\\Linear\\Application\\moo.cfg”);
(*env)->SetObjectArrayElement(env,arr,2,name);
name=(*env)->NewStringUTF(env,“-startupLog”);
(*env)->SetObjectArrayElement(env,arr,3,name);
name=(*env)->NewStringUTF(env,“C:\\Users\\Ash\\Desktop\\moo Test\\moo Test\\Log\\mooStartup.Log”);
(*env)->SetObjectArrayElement(env,arr,4,name);
name=(*env)->NewStringUTF(env,“-geminiX3”);
(*env)->SetObjectArrayElement(env,arr,5,name);
obj=(*env)->NewObject(env,jClass,MID_init,arr);
如果(!obj){
printf(“错误:分配对象失败\n”);
返回NULL;
}
返回obj;
}
常量字符*请求(jobject对象,字符*输入)
{
jstring输入字符串;
jstring输出字符串;
const char*nativeString;
jmethodID mID=(*env)->GetMethodID(env,jClass,“request”,“(Ljava/lang/String;)Ljava/lang/String;”;
如果(!mID){
printf(“\n错误:未找到dllClass.request()”;
返回0;
}
printf(“此处”);fflush(stdout);
inputString=(*env)->NewStringUTF(env,input);
printf(“此处2”);fflush(标准输出);
outputString=(*env)->CallObjectMethod(env、obj、mID、inputString);
nativeString=(*env)->GetStringUTFChars(env,outputString,0);
投资回报;
}
孔隙测试(jobject obj)
{/*
jmethodID mID=(*env)->GetMethodID(env,jClass,“request”,“([Ljava/lang/String;)[Ljava/lang/String;”;
如果(!mID){
printf
#include <jni.h>
#include <windows.h>

JNIEnv  *env;
JavaVM  *jvm;
HANDLE  hUserDll;
jclass  jClass;
char*  dllname;

/*
 * Load dll.
 */
HANDLE loadDll(char* name)
{
    HANDLE hDll = LoadLibrary (name);

    if (!hDll) {
        printf ("Unable to load %s\n", name);
        exit(1);
    }

    printf ("%s loaded\n", name);

    return hDll;
}

jint (JNICALL * JNI_GetDefaultJavaVMInitArgs_func) (void *args);
jint (JNICALL * JNI_CreateJavaVM_func) (JavaVM **pvm, void **penv, void *args);



/*
 * 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);
}


/*
 * Look for class.
 */
jclass lookForClass (JNIEnv* env, char* name)
{
    jclass clazz = (*env)->FindClass (env, name);

    if (!clazz) {
        printf("Unable to find class %s\n", name);
        exit(1);
    }

    printf ("Class %s found\n", name);
    fflush (stdout);

    return clazz;
}


int initDll(char* userDllName) 
{
  jClass = NULL;
  hUserDll = loadDll(userDllName); 
  dllname = userDllName;
  initJavaRT(hUserDll, &jvm, &env); 
  jClass = lookForClass(env, "mooMain/mooGeminiX3/mooGeminiX3IFX");
  return jClass ? 1 : 0;
}

/** finalizeDll() - stop Java VM
 */
void finalizeDll ()
{
    (*jvm)->DestroyJavaVM (jvm);
    FreeLibrary((HMODULE)hUserDll);
    hUserDll = NULL;
    jClass   = NULL;
}


jobject newClassInstance()
{

    jmethodID MID_init;
    jobject obj;
    jstring name;
    jobjectArray ret;
    jclass sclass;
    jobjectArray arr;

    MID_init = (*env)->GetMethodID (env, jClass, "<init>", "([Ljava/lang/String;)V");
    if (!MID_init) {
        printf("Error: dllClass.<init>() not found\n");
        return NULL;
    }
    sclass = (*env)->FindClass(env, "java/lang/String");
    arr = (*env)->NewObjectArray(env, 6, sclass, NULL);


    name = (*env)->NewStringUTF(env,"@C:\\Users\\Ash\\Desktop\\moo-Test\\moo-Test\\mooRoot.cfg");
    (*env)->SetObjectArrayElement(env,arr,0,name);  
    name = (*env)->NewStringUTF(env,"-cfg");
    (*env)->SetObjectArrayElement(env,arr,1,name);
    name = (*env)->NewStringUTF(env,"C:\\Users\\Ash\\Desktop\\moo-CVS\\moo-PCB\\Application\\Configuration\\Linear\\Application\\moo.cfg");
    (*env)->SetObjectArrayElement(env,arr,2,name);
    name = (*env)->NewStringUTF(env,"-startupLog");
    (*env)->SetObjectArrayElement(env,arr,3,name);  
    name = (*env)->NewStringUTF(env,"C:\\Users\\Ash\\Desktop\\moo-Test\\moo-Test\\Log\\mooStartup.log"); 
    (*env)->SetObjectArrayElement(env,arr,4,name);
    name = (*env)->NewStringUTF(env,"-geminiX3"); 
    (*env)->SetObjectArrayElement(env,arr,5,name);












    obj = (*env)->NewObject(env, jClass, MID_init, arr);
    if (!obj) {
        printf("Error: failed to allocate an object\n");
        return NULL;
    }
    return obj;
}

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;
    }
    printf("here"); fflush(stdout);
    inputString = (*env)->NewStringUTF(env, input);
    printf("here2"); fflush(stdout);

    outputString = (*env)->CallObjectMethod(env, obj, mID, inputString);    

    nativeString = (*env)->GetStringUTFChars(env, outputString, 0); 


    return nativeString;
}

void voidtest(jobject obj )
{/*
    jmethodID mID = (*env)->GetMethodID (env, jClass, "request", "([Ljava/lang/String;)[Ljava/lang/String;");

    if (!mID){
        printf("\nError: dllClass.request() not found\n");
        return 0;
    }

    char inputString[] = (*env)->NewStringUTF(env, "Moo");

    (*env)->CallVoidMethod(env, obj, mID, inputString);*/
}   

void close()
{
    jmethodID mID = (*env)->GetMethodID (env, jClass, "close", "()V");
    if (!mID){
        printf("\nError: dllClass.close() not found\n");
    }

    (*env)->CallVoidMethod(env,jClass, mID);
}


int invokeStaticMethod()
{
    jmethodID MID_init;
    jobject obj;
    jstring name;
    jobjectArray ret;
    jclass sclass;
    jobjectArray arr;
    jmethodID mID = (*env)->GetStaticMethodID(env, jClass, "start", "([Ljava/lang/String;)V");

    if (!mID){
        printf("\nError: dllClass.sfstart() not found\n");
        return 0;
    }

    sclass = (*env)->FindClass(env, "java/lang/String");
    arr = (*env)->NewObjectArray(env, 5, sclass, NULL);


    name = (*env)->NewStringUTF(env,"@C:\\Users\\Ash\\Desktop\\moo-Test\\moo-Test\\mooRoot.cfg");
    (*env)->SetObjectArrayElement(env,arr,0,name);  
    name = (*env)->NewStringUTF(env,"-cfg");
    (*env)->SetObjectArrayElement(env,arr,1,name);
    name = (*env)->NewStringUTF(env,"C:\\Users\\Ash\\Desktop\\moo-CVS\\moo-PCB\\Application\\Configuration\\Linear\\Application\\moo.cfg");
    (*env)->SetObjectArrayElement(env,arr,2,name);
    name = (*env)->NewStringUTF(env,"-startupLog");
    (*env)->SetObjectArrayElement(env,arr,3,name);  
    name = (*env)->NewStringUTF(env,"C:\\Users\\Ash\\Desktop\\moo-Test\\moo-Test\\Log\\mooStartup.log"); 
    (*env)->SetObjectArrayElement(env,arr,4,name);



    (*env)->CallStaticVoidMethod(env,jClass, mID, arr);
    printf("\nGot to here\n");

    return 1;
}
[DllImport("Stubs", CallingConvention=CallingConvention.Cdecl)]