Java:如何在jni调用中为本机代码处理错误?

时间:2009-04-28 02:00:39

标签: java error-handling java-native-interface

我已经谷歌了一下,并没有真正找到一个很好的答案我的问题:从本机jni代码传递错误信息到java的习惯方法是什么?

我通常会选择一个设计并继续使用它,但是这个代码每5毫秒(大约)被调用一次,所以我想我会问是否有一种习惯性的“干净/高效”的方法来做到这一点。 / p>

我看到它的方式,我有四个明显的选择:

  1. 在每次调用时,在java中创建一个“错误返回”对象并将其传递给JNI。如果出现问题,本机代码将填写此对象中的错误描述,并且java代码会在返回时检查它。由于错误不是常见情况,因此会为GC创建大量对象以进行清理,其中99.99%是不必要的。

  2. 与#1类似,在java类中创建一些单个“错误返回”对象,该对象一遍又一遍地传递给每个方法调用。在每次返回的java代码中检查它是否有错误。这对我来说似乎很狡猾,但也许这是正确的选择?

  3. 在本机代码中创建一个对象,其中包含错误的描述(如果适用),并将其作为返回值传递给java。在java中调用之后,检查返回null。这似乎比#1少浪费,但似乎有点尴尬。

  4. 只需在jni方法上构建一个整数返回值,并传回一个对应于本机代码“exit”值的int。枚举java映射中的所有可能的本机退出状态。将返回值与“0”进行比较,并在必要时在此映射中查找错误。这似乎比其他更有效,但似乎更笨拙,因为本机代码的更改将需要有人返回并更新“错误表”。

  5. 我觉得好像我错过了一些明显的东西......那里有一位可以提供任何见解的大师吗?

    谢谢!

2 个答案:

答案 0 :(得分:4)

答案 1 :(得分:1)

关于您注意到的方法:

  1. 正如您所提到的,这会产生大量的分配/解除分配调用。
  2. 如果您有多个线程调用您的本机代码,则此方法将不起作用。
  3. 这假设您不需要其他任何返回值。还有一个问题是错误对象何时何地被“释放”。
  4. 假设您没有将返回值用于其他任何内容,并且您不需要任何有关错误的“额外”信息,这是一个很好的解决方案。可能的错误不应经常更改,以至于在更新Java代码时会产生问题。
  5. 当然,如果 需要您的返回值,并且您想了解有关实际错误的更详细信息,则应使用exceptions