我试图使用JNA在C#和Java之间建立一个回调接口.
C#< - CLI - > Visual C 2010< - JNA - > Java的
在Java和C之间我使用非托管结构来获得回调功能.在C中我试图将具有回调指针的结构包装到托管对象中.
在Java和C之间,一切正常,直到我尝试使用gcroot在非托管代码中生成托管对象.
更新它甚至没有gcroot失败.只需使用“Logger ^ logger = gcnew Logger(logStruct);”
我目前的解决方案如下:
Java的
LoggerStruct.java
package jnatest;
import com.sun.jna.Callback;
import com.sun.jna.Structure;
import java.util.logging.Logger;
public class LoggerStruct extends Structure {
private Logger logger;
public interface GetLevelCallback extends Callback {
int callback();
}
public GetLevelCallback getLevel;
public LoggerStruct(Logger log) {
super();
this.log = log;
getLevel = new GetLevelCallback() {
public int callback() {
return logger.getLevel().intValue();
}
}
setFieldOrder(new String[] {"getLevel"});
}
}
ITestLib.java
package jnatest;
import com.sun.jna.Library;
import com.sun.jna.Native;
public interface ITestLib extends Library {
ITestLib INSTANCE = (ITestLib) Native.loadLibrary("JNATestC",ITestLib.class);
int callbackTest(LoggerStruct logStruct);
}
Main.java
package jnatest;
import com.sun.jna.NativeLibrary;
import java.util.logging.Logger;
import java.util.logging.FileHandler;
public class MainClass {
public static void main(String[] args) throws Exception {
NativeLibrary.addSearchPath("JNATestC","C:\\JNATest");
Logger log = Logger.getLogger("Test");
FileHandler fileTxt = new FileHandler("Logging.txt");
log.addHandler(fileTxt);
LoggerStruct logStruct = new LoggerStruct(log);
ITestLib.INSTANCE.callbackTest(logStruct);
}
}
C
JNATestC.h
#pragma once
extern "C" {
struct LoggerStruct {
int (*getLevel)();
}
__declspec(dllexport) void callbackTest(LoggerStruct * logStruct);
}
namespace JnaWrapperTypes {
public ref class Logger { // "public ref" because I have to use it in C# as well
private:
LoggerStruct * logStruct;
public:
Logger(LoggerStruct * logStruct);
~Logger() {}
int getLevel();
};
}
JNATestC.cpp
#include "stdafx.h"
#include
我在飞行中写了这些.我希望这些也可以验证.
我究竟做错了什么?例如,如果我使用…
gcroot
……一切正常
是否有另一种方法将托管对象传递给C#?
UPDATE
似乎任何我自己的Class用法都会让我失败.
UPDATE
我自己管理的对象或函数的Anykind使我失败.
UPDATE
StaticCSharpClass :: STATICMETHOD();也失败了.看起来所有与托管对象相关的操作都会失败.
UPDATE
只是为了让这个问题更容易找到
内部错误(0xe0434352)
最佳答案