Java JNI堆叠防坠落

Java JNI堆叠防坠落,java,java-native-interface,Java,Java Native Interface,我使用javajni与。有些服务器端应用程序构建在JNI绑定之上。如果JNI部分中有错误,整个JVM堆栈将下降 测试c/c++库不包含会导致JVM堆栈崩溃的致命错误的最佳方法是什么?干净地处理确实出现的错误的最佳实践是什么?您是否打开了这些JVM设置 -verbose:jni -Xcheck:jni 我发现它们对于JNI代码的初始开发非常宝贵 -Xcheck:jni选项激活一组围绕jni函数的包装函数。包装函数对传入参数执行检查。这些检查包括: 调用和初始化JNI的调用是否在同一线程上 对象

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


测试c/c++库不包含会导致JVM堆栈崩溃的致命错误的最佳方法是什么?干净地处理确实出现的错误的最佳实践是什么?

您是否打开了这些JVM设置

-verbose:jni -Xcheck:jni
我发现它们对于JNI代码的初始开发非常宝贵

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

  • 调用和初始化JNI的调用是否在同一线程上
  • 对象参数是否为有效对象
  • 本地引用还是全局引用引用有效对象
  • 字段类型是否与
    GetField
    SetField
    调用匹配
  • 静态和非静态字段ID是否有效
  • 字符串是否有效且非空
  • 数组元素是否为非空
  • 数组元素上的类型

您是否已打开这些JVM设置

-verbose:jni -Xcheck:jni
我发现它们对于JNI代码的初始开发非常宝贵

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

  • 调用和初始化JNI的调用是否在同一线程上
  • 对象参数是否为有效对象
  • 本地引用还是全局引用引用有效对象
  • 字段类型是否与
    GetField
    SetField
    调用匹配
  • 静态和非静态字段ID是否有效
  • 字符串是否有效且非空
  • 数组元素是否为非空
  • 数组元素上的类型

    • 我想到两件事:

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

      2) 。你是C++/JNI开发者的幸运儿。我遇到的大多数问题都是在JNI层的“皮肤”上。也就是说,我有一个合理稳定的现有库,我用JNI封装了它。如果我无意中将空指针传递给现有代码,库会感到不安,如果我没有在响应中检查空指针,我也可能会有问题。所以我们花了很多精力来清理包装层。在可能出现意外结果的任何地方,我们都添加了检查


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

      想到两件事:

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

      2) 。你是C++/JNI开发者的幸运儿。我遇到的大多数问题都是在JNI层的“皮肤”上。也就是说,我有一个合理稳定的现有库,我用JNI封装了它。如果我无意中将空指针传递给现有代码,库会感到不安,如果我没有在响应中检查空指针,我也可能会有问题。所以我们花了很多精力来清理包装层。在可能出现意外结果的任何地方,我们都添加了检查


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

      测试只能告诉你是否存在bug,而不能告诉你是否存在bug。它能告诉我是否不存在bug吗?:pTesting只能告诉您是否有bug,而不能告诉您是否有bug。它能告诉我是否没有bug吗pGDAL是一个相对稳定、使用良好的C/C++库。我想JNI包装部分需要更多的爱。我将研究通过“皮肤”的消毒材料。GDAL是相对稳定的、使用良好的C/C++库。我想JNI包装部分需要更多的爱。我将研究通过“皮肤”的消毒物质。