Ste*_*veL 19 java-native-interface android opengl-es android-ndk
将我的手机升级到android 4.03后,我的游戏再次打开,它只是关闭而没有任何错误消息在deviCe上和这个在eclipse上
04-02 16:55:27.672: E/dalvikvm(26884): JNI ERROR (app bug): attempt to use stale local reference 0x1
04-02 16:55:27.672: E/dalvikvm(26884): VM aborting
Run Code Online (Sandbox Code Playgroud)
我的游戏主要是用java编写的,但有些部分是在c中,我觉得这个问题是(因为它说JNI ERROR :)不是很难弄清楚))
当然我不知道问题在哪里,所以我不给任何代码
我没有在android 2.3上遇到这个问题
我不知道它是否有帮助但我有时也会得到这个错误
04-02 16:55:26.061: E/Adreno200-ES11(26884): <qglDrvAPI_glTexImage2D:1913>: GL_STACK_UNDERFLOW
Run Code Online (Sandbox Code Playgroud)
Ern*_*ill 30
"陈旧的本地引用"错误意味着您在JNI调用之间保存对某些Java对象的本地引用; 您需要NewGlobalRef在执行任何会导致引用超出一个JNI调用范围之外的任何内容之前,使用该方法将该引用转换为全局引用.
虽然严格来说这总是必要的 - 这是在JNI规范中 - 只有冰淇淋三明治以后才会在Android平台上造成问题.
Ily*_*lya 21
虽然Ernest的答案在技术上是正确的,但是对0x1之类的陈旧本地引用应该暗示Java VM正在尝试使用不是Java对象的东西作为Java对象.
例如,假设你的JNI函数是:
JNI_EXPORT jboolean foobar(JNIEnv *env, jobject self) {
...
return JNI_TRUE;
}
Run Code Online (Sandbox Code Playgroud)
但是您错误地将Java对应方声明为public native Boolean foobar()而不是public native boolean foobar().
这是一个容易犯的错误,因为boolean和之间的唯一区别Boolean是大写.
boolean,一种原始类型,在JNI中表示为 booleanjava.lang.Boolean,也称为Boolean,是一种在JNI中表示为的类类型jobject返回时foobar,Java VM会将JNI_TRUE值(0x1)视为引用java.lang.Boolean对象,这将导致此致命错误.
sco*_*awg 13
@Ernest和@Ilya都是对的.请注意,问题也以其他方式表现出来,而不仅仅是签名不匹配.还有另一个非常具体的案例,我在Android团队的博客中解释了这一点:
错误:错误地假设FindClass()返回全局引用
FindClass()返回本地引用.很多人不这么认为.在没有类卸载的系统(如Android)中,您可以将jfieldID和jmethodID视为全局.(它们实际上不是引用,但在具有类卸载的系统中存在类似的生命周期问题.)但是jclass是一个引用,而FindClass()返回本地引用.常见的错误模式是"静态jclass".除非您手动将本地引用转换为全局引用,否则您的代码将被破坏.
基本上我是jclass按FindClass原样缓存返回的全局变量,但事实证明这个值(从Android 4开始?)现在是一个localref.因此,我不得不将其转换为像这样的globalref:
jclass jc = env->FindClass(callbacks.name);
// Since Android ICS, class references are not global so we need to peg a
// global reference to the jclass returned by FindClass(), otherwise we get
// following error in the log:
// "JNI ERROR (app bug): attempt to use stale local reference 0xHHHHHHHH".
callbacks._class = static_cast<jclass>(env->NewGlobalRef(jc));
Run Code Online (Sandbox Code Playgroud)
经过大量的讨论,这为我解决了这个问题.
| 归档时间: |
|
| 查看次数: |
18606 次 |
| 最近记录: |