JNI在某些设备上的实现方式不同吗?

时间:2011-04-05 16:58:21

标签: android java-native-interface

我有一个本机应用程序(2.2)在我的旧摩托罗拉Droid设备(2.1)上运行没有问题。最近我购买了一个闪亮的新Sanyo Zio(2.2.1),但是在Droid上运行的相同代码会出现以下运行时错误:

04-05 12:43:34.006: WARN/dalvikvm(901): JNI WARNING: expected return type 'I'

然后代码中止。 我试图通过以下调用从Native端获取一个长变量:

static jmethodID = java_getScore = env->GetStaticMethodID(javaClass, "native_getScore", "()J");

JNI实现在我的旧Droid上完美运行,但在新的Zio上却没有。

我原来的实施中是否有一些我忽略的东西?

谢谢你的时间。

3 个答案:

答案 0 :(得分:1)

除了许多较小的缺陷之外,JNI还存在至少一个主要缺陷:它不是平台/设备非特定的。

让我讨厌JNI的另一个问题是你无法访问任意DLL中的任意函数。 JNI要求你用C / C ++编写一个粘合层,以便做你想做的任何本地工作。

所以是的,简而言之,每个设备上的JNI实现都不同。

答案 1 :(得分:0)

正如你最终发现的那样,(我也刚刚发现)有不同的函数,从本机代码调用Java方法。它们列在这里: http://java.sun.com/docs/books/jni/html/functions.html#87060

答案 2 :(得分:0)

不,我所知道的任何设备的JNI实现方式都不同。但它从发布到发布都有所变化(我知道这一点,因为我经常是那个人)。特别是,较新的版本可能会在您的代码中发现更多错误。最好的防御措施是在最新版本上使用CheckJNI运行代码:http://android-developers.blogspot.com/2011/07/debugging-android-jni-with-checkjni.html

特别是,较新的版本会在您的情况下报告稍微更好的错误消息,告诉您调用的内容和调用的内容,以及您尝试调用的方法。