首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java JNIEnv分割故障

Java JNIEnv分割故障
EN

Stack Overflow用户
提问于 2011-07-27 19:15:28
回答 1查看 1.5K关注 0票数 5

我正在使用它们之间的本机库来执行一些Java<->.NET互操作代码,到目前为止一切都进行得相当顺利。

但是,由于某些原因,我不能在JNIEnv下运行任何方法。

代码语言:javascript
复制
System::String^ JNIStringToNet(JNIEnv * env, jstring js)
{
    const char *buf = env->GetStringUTFChars(js, 0); // segfault

现在,我可以来回传递变量,并执行所有其他类型的通信,因此我想我还没有正确地初始化这个或其他什么。

我是这样装的:

代码语言:javascript
复制
this.Lib = (LibHandler)Native.loadLibrary(this.Name, LibHandler.class);     

(我更喜欢Native.loadLibrary,因为它似乎允许我使用它做更多的事情,例如多个库之间的类共享,以及取消连接并从JVM动态重新挂钩)。

编辑:

认真地说,任何方法:

代码语言:javascript
复制
std::cout << "Getting version:" << std::endl;
std::cout << env->GetVersion() << std::endl;

获取版本:

(分段故障)

任何关于JNIEnv的想法会对每一种方法进行分段的错误吗?这应该由JVM来设置,对吗?

编辑2:

这是一个C++应用程序,它调用将与.NET库接口的.NET库(因此它是一个CLR编译的C++库,如果这有任何区别的话),以限制任何外部因素--我甚至不调用.NET DLL,而只是转换返回的字符串(或者好的.正在尝试)。

因此,例如,来自Java:

代码语言:javascript
复制
this.Lib = (LibHandler)Native.loadLibrary(this.Name, LibHandler.class);
this.Lib.myCPPMethod(); // Segmentation fault during this call, JVM crashes.

奇怪的是,是否是CLR导致了它:禁用clr编译并删除与CLR相关的所有内容,仍然这样做。

编辑3:

把它扔了:

代码语言:javascript
复制
#
# 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:

实际呼叫:

代码语言:javascript
复制
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一起工作:

代码语言:javascript
复制
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;
}

输出:

代码语言:javascript
复制
java -Djava.library.path="(dir)\lib\64" EntryPoint
Getting version:
65542

好了!我指的是一些进展,但我不能从装载在System.loadLibrary中的JVM卸载库,对吗?

基本上,我需要能够将这些库从JVM中断开并交换出去,除此之外,它们都需要“共享”单个类,并且能够在运行时绑定到类.这就是我和Native.loadLibrary一起去的原因。

目前我这样做:

加载DLL:

代码语言:javascript
复制
this.Lib = (LibHandler)Native.loadLibrary(this.Name, LibHandler.class);

解开钩子:

代码语言:javascript
复制
this.Lib = null;
Runtime.getRuntime().gc(); // Force the JVM to drop it immediately.

类I将它们全部加载到:

代码语言:javascript
复制
public interface LibHandler extends Library{ 
    void T();
}

有任何方法可以与System.loadLibrary类似地工作吗?

编辑6:

随便叫我哑巴吧,我用的是JNA,而不是 JNI,这是完全不同的,也是我问题的一个巨大来源.有办法和JNI合作吗?或者我能让JNIEnv以某种方式在JNA注册吗?我猜我可以从C++库中删除JNI并直接使用wstring?

我明天再来拿这个。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-28 14:19:20

我感觉很糟。

Native.loadLibrary == JNA.

System.loadLibrary == JNI.

JNA的目的是不需要任何关于JVM环境的真正知识,所以您可以按原样运行本机库,所以可以使用char*代替jstring。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6849931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档