Android JNI在某些设备上的实现是否不同?

Android JNI在某些设备上的实现是否不同?,android,java-native-interface,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' 然后代码就会中止。 我试图通过以下调用从本机端获取一个长变量: static jmethodID = java_getScore = env-&g

我有一个本地应用程序(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'
然后代码就会中止。 我试图通过以下调用从本机端获取一个长变量:

static jmethodID = java_getScore = env->GetStaticMethodID(javaClass, "native_getScore", "()J");
JNI实现在我的旧Droid上工作得很好,但在新的Zio上却不行

我在最初的实现中是否忽略了什么


感谢您的时间。

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

另一个让我讨厌JNI的问题是,您不能访问任意DLL中的任意函数。JNI要求您在C/C++中编写一个粘合层,以便执行您本机打算执行的任何操作


因此,简言之,JNI在每个设备上的实现都是不同的。

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

另一个让我讨厌JNI的问题是,您不能访问任意DLL中的任意函数。JNI要求您在C/C++中编写一个粘合层,以便执行您本机打算执行的任何操作

因此,简言之,JNI实现在每个设备上都是不同的。

正如您最终发现的,(我也刚刚发现)有不同的函数,从本机代码调用Java方法。它们列在这里:

正如您最终发现的,(我也刚刚发现)有不同的函数,可以从本机代码调用Java方法。它们列在这里:

不,据我所知,JNI在任何设备上的实现方式都不一样。但它会随着版本的变化而变化(我知道这一点,因为我经常是开发它的人)。特别是,较新的版本可能会在代码中发现更多错误。最好的防御措施是在最新版本上使用CheckJNI运行代码:


特别是,较新的版本会在您的情况下报告一条稍微好一点的错误消息,告诉您调用了什么、应该调用什么,以及您试图调用什么方法。

不,JNI在我所知道的任何设备上的实现都没有什么不同。但它会随着版本的变化而变化(我知道这一点,因为我经常是开发它的人)。特别是,较新的版本可能会在代码中发现更多错误。最好的防御措施是在最新版本上使用CheckJNI运行代码:


特别是,较新的版本会在您的案例中报告一条稍微好一点的错误消息,告诉您调用了什么以及您应该调用什么,以及您试图调用的方法。

结果表明,新设备是正确的…我调用的是CallStaticIntMethod而不是CallStaticLongMethod,而旧设备不关心。结果表明,新设备是正确的…我调用的是CallStaticIntMethod而不是CallStaticLongMethod,而旧设备不关心。