我正在使用它们之间的本机库来执行一些Java<->.NET互操作代码,到目前为止一切都进行得相当顺利。
但是,由于某些原因,我不能在JNIEnv下运行任何方法。
System::String^ JNIStringToNet(JNIEnv * env, jstring js)
{
const char *buf = env->GetStringUTFChars(js, 0); // segfault现在,我可以来回传递变量,并执行所有其他类型的通信,因此我想我还没有正确地初始化这个或其他什么。
我是这样装的:
this.Lib = (LibHandler)Native.loadLibrary(this.Name, LibHandler.class); (我更喜欢Native.loadLibrary,因为它似乎允许我使用它做更多的事情,例如多个库之间的类共享,以及取消连接并从JVM动态重新挂钩)。
编辑:
认真地说,任何方法:
std::cout << "Getting version:" << std::endl;
std::cout << env->GetVersion() << std::endl;获取版本:
(分段故障)
任何关于JNIEnv的想法会对每一种方法进行分段的错误吗?这应该由JVM来设置,对吗?
编辑2:
这是一个C++应用程序,它调用将与.NET库接口的.NET库(因此它是一个CLR编译的C++库,如果这有任何区别的话),以限制任何外部因素--我甚至不调用.NET DLL,而只是转换返回的字符串(或者好的.正在尝试)。
因此,例如,来自Java:
this.Lib = (LibHandler)Native.loadLibrary(this.Name, LibHandler.class);
this.Lib.myCPPMethod(); // Segmentation fault during this call, JVM crashes.奇怪的是,是否是CLR导致了它:禁用clr编译并删除与CLR相关的所有内容,仍然这样做。
编辑3:
把它扔了:
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000000000000, pid=1596, tid=7248
#
# JRE version: 6.0_23-b05
# Java VM: Java HotSpot(TM) 64-Bit Server VM (19.0-b09 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C 0x0000000000000000所以是的,看来JVM没有给我内存访问权限。
编辑4:
实际呼叫:
JNIEXPORT jstring JNICALL Query(JNIEnv * env, jobject jobj, jstring start, jstring end)
{
std::cout << "Getting version:" << std::endl;
jint j = env->GetVersion();
return jstring("test");
}编辑5:
与System.loadLibrary一起工作:
JNIEXPORT void JNICALL Java_LibTest_T(JNIEnv *env, jobject jobj)
{
std::cout << "Getting version:" << std::endl;
jint j = env->GetVersion();
std::cout << j << std::endl;
}输出:
java -Djava.library.path="(dir)\lib\64" EntryPoint
Getting version:
65542好了!我指的是一些进展,但我不能从装载在System.loadLibrary中的JVM卸载库,对吗?
基本上,我需要能够将这些库从JVM中断开并交换出去,除此之外,它们都需要“共享”单个类,并且能够在运行时绑定到类.这就是我和Native.loadLibrary一起去的原因。
目前我这样做:
加载DLL:
this.Lib = (LibHandler)Native.loadLibrary(this.Name, LibHandler.class);解开钩子:
this.Lib = null;
Runtime.getRuntime().gc(); // Force the JVM to drop it immediately.类I将它们全部加载到:
public interface LibHandler extends Library{
void T();
}有任何方法可以与System.loadLibrary类似地工作吗?
编辑6:
随便叫我哑巴吧,我用的是JNA,而不是 JNI,这是完全不同的,也是我问题的一个巨大来源.有办法和JNI合作吗?或者我能让JNIEnv以某种方式在JNA注册吗?我猜我可以从C++库中删除JNI并直接使用wstring?
我明天再来拿这个。
发布于 2011-07-28 14:19:20
我感觉很糟。
Native.loadLibrary == JNA.
System.loadLibrary == JNI.
JNA的目的是不需要任何关于JVM环境的真正知识,所以您可以按原样运行本机库,所以可以使用char*代替jstring。
https://stackoverflow.com/questions/6849931
复制相似问题