代码之家  ›  专栏  ›  技术社区  ›  whatnick

JAVA JNI堆栈预防

  •  0
  • whatnick  · 技术社区  · 15 年前

    我使用Java JNI Gdal . 有一些服务器端应用程序构建在JNI绑定之上。如果JNI部分中有错误,则整个JVM堆栈将下降。

    测试C/C++库不包含致命错误会导致JVM STATKEFREST的最好方法是什么?清洁处理出现的错误的最佳实践是什么?

    2 回复  |  直到 12 年前
        1
  •  2
  •   djna    15 年前

    我想到两件事:

    1)。如果您有可能将C++代码作为单独的进程运行(使用任何RPC技术来进行通信),那么您就回避了这个问题,尽管牺牲了性能。

    2)。您正处于C++/JNI开发人员的青睐之中。我遇到的大多数问题都在JNI层的“皮肤”上。也就是说,我有一个相当稳定的现有库,我用JNI包起来。如果我不小心将空指针传递给现有代码,库会很不高兴;如果我未能检查响应中的空值,则也可能有问题。所以我们对包装层进行了大量的消毒。任何有可能产生意外结果的地方,我们都增加了检查。

    当然,如果整个库都是新的,那么生活就更困难了——最终你只需要生成健壮的代码。

        2
  •  2
  •   simon04 Jonathan A. Marshall    12 年前

    你打开这些JVM设置了吗?

    -verbose:jni -Xcheck:jni
    

    我发现它们对于JNI代码的初始开发非常有价值。

    这个 -Xcheck:jni 选项在JNI函数周围激活一组包装函数。包装函数对传入参数执行检查。这些检查包括:

    • 调用和初始化JNI的调用是否在同一线程上。
    • 对象参数是否为有效对象。
    • 本地或全局引用是否引用有效对象。
    • 字段类型是否与 Get<Type>Field Set<Type>Field 打电话。
    • 静态和非静态字段ID是否有效。
    • 字符串是否有效和非空。
    • 数组元素是否为非空。
    • 数组元素上的类型。