【问题标题】:Using SWIG to return Byte[] causing jvm to segv on exit使用 SWIG 返回 Byte[] 导致 jvm 在退出时 segv
【发布时间】:2013-11-20 18:24:45
【问题描述】:

我向一个类添加了一个方法来返回一个空终止 一组字节。我希望在 java 中返回一个 byte[] 由于此更改,该功能似乎有效 就返回字节而言非常好,但是 jvm 在退出时因 segv 而崩溃。 我打印了出现在输出中的“exiting main” 然后segv发生了

C++类

class squid {
 const signed char* getBytes()
}

squidx.i

%typemap(jni) const signed char*        "jbyteArray"
%typemap(jtype) const signed char*      "byte[]"
%typemap(jstype) const signed char*     "byte[]"
%typemap(out) const signed char*
{
   long lSize = strlen($);

   // create a new byte[] object in Java
   jbyteArray data = JCALL1(NewByteArray, jenv, lSize);

   // copy pixels from the image buffer
   JCALL4(SetByteArrayRegion, jenv, data, 0, lSize, (jbyte*)result);

   $result = data;
}

// change Java wrapper mapping for unsigned char*
%typemap(javaout) const signed char* {
    return $jnicall;
}

java -version 的结果

java版本“1.7.0” Java(TM) SE 运行时环境(构建 pxa6470sr5-20130619_01(SR5)) IBM J9 VM(内部版本 2.6,JRE 1.7.0 Linux amd64-64 压缩参考 20130617_152572(启用 JIT,启用 AOT) J9VM - R26_Java726_SR5_20130617_1436_B152572 JIT - r11.b04_20130528_38954ifx1 GC - R26_Java726_SR5_20130617_1436_B152572_CMPRSS J9CL-20130617_152572) JCL - 20130616_01 基于 Oracle 7u25-b12

【问题讨论】:

    标签: java c++ jvm swig


    【解决方案1】:

    看看来自 SWIG 发行版的java/typemaps.i。可能它已经包含所需的类型映射。检查OUTPUT_TYPEMAPINOUT_TYPEMAP 以获取参考实现。

    【讨论】:

    • 不,typemaps.i 只通过 typemap(argout) 处理指针
    【解决方案2】:

    原来这是与原生世界中仍然存在的其他线程的交互 和java一点关系都没有。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-13
      • 2013-08-13
      • 1970-01-01
      • 1970-01-01
      • 2014-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多