首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android :全局和本地引用变量崩溃

Android :全局和本地引用变量崩溃
EN

Stack Overflow用户
提问于 2014-09-21 11:46:23
回答 2查看 1.2K关注 0票数 2

我有调用java对象方法的jni c++代码,例如:

代码语言:javascript
复制
jclass JIOManager = CJavaEnv::getInstance()->env()->FindClass(ioManagerName);

    ..... some code

CJavaEnv::getInstance()->env()->DeleteLocalRef(JIOManager);

当在主线程中执行时,这很好,但是当我试图在另一个线程中执行时,它会崩溃,因为它说它是在另一个线程中创建的:O!但是当我在google开发者网站上看到后,他们说从任何线程访问Global都行,所以我修改了代码。

代码语言:javascript
复制
jclass JIOManager = (jclass)CJavaEnv::getInstance()->env()->NewGlobalRef( CJavaEnv::getInstance()->env()->FindClass(ioManagerName) );

    ..... some code

CJavaEnv::getInstance()->env()->DeleteGlobalRef(JIOManager);

但我看到了这场车祸:

代码语言:javascript
复制
09-21 15:38:13.259: E/dalvikvm(3210): JNI ERROR (app bug): local reference table overflow (max=512)
09-21 15:38:13.259: W/dalvikvm(3210): JNI local reference table (0x76fb50) dump:
09-21 15:38:13.259: W/dalvikvm(3210):   Last 10 entries (of 512):
09-21 15:38:13.259: W/dalvikvm(3210):       511: 0x40a609a8 java.lang.Class<libcore.icu.NativeConverter>
09-21 15:38:13.259: W/dalvikvm(3210):       510: 0x42349610 byte[] (1 elements)
09-21 15:38:13.259: W/dalvikvm(3210):       509: 0x41d866b8 java.lang.Class<com.Cocoa.CocoaAndroidSDK.CocoaUnicodeConverter>
09-21 15:38:13.259: W/dalvikvm(3210):       508: 0x423495f8 byte[] (2 elements)
09-21 15:38:13.259: W/dalvikvm(3210):       507: 0x42349428 byte[] (1 elements)
09-21 15:38:13.259: W/dalvikvm(3210):       506: 0x41d866b8 java.lang.Class<com.Cocoa.CocoaAndroidSDK.CocoaUnicodeConverter>
09-21 15:38:13.259: W/dalvikvm(3210):       505: 0x42349410 byte[] (2 elements)
09-21 15:38:13.259: W/dalvikvm(3210):       504: 0x422b3f08 byte[] (1 elements)
09-21 15:38:13.259: W/dalvikvm(3210):       503: 0x41d866b8 java.lang.Class<com.Cocoa.CocoaAndroidSDK.CocoaUnicodeConverter>
09-21 15:38:13.259: W/dalvikvm(3210):       502: 0x422b3ef0 byte[] (2 elements)
09-21 15:38:13.259: W/dalvikvm(3210):   Summary:
09-21 15:38:13.259: W/dalvikvm(3210):       172 of java.lang.Class (3 unique instances)
09-21 15:38:13.259: W/dalvikvm(3210):         1 of java.lang.String
09-21 15:38:13.259: W/dalvikvm(3210):         8 of byte[] (8 unique instances)
09-21 15:38:13.259: W/dalvikvm(3210):        20 of byte[] (1 elements) (20 unique instances)
09-21 15:38:13.259: W/dalvikvm(3210):        27 of byte[] (2 elements) (27 unique instances)
09-21 15:38:13.259: W/dalvikvm(3210):         2 of byte[] (3 elements) (2 unique instances)
09-21 15:38:13.259: W/dalvikvm(3210):        16 of byte[] (4 elements) (16 unique instances)
09-21 15:38:13.259: W/dalvikvm(3210):        40 of byte[] (5 elements) (40 unique instances)
09-21 15:38:13.259: W/dalvikvm(3210):         2 of byte[] (6 elements) (2 unique instances)
09-21 15:38:13.259: W/dalvikvm(3210):         4 of byte[] (7 elements) (4 unique instances)
09-21 15:38:13.259: W/dalvikvm(3210):        22 of byte[] (8 elements) (22 unique instances)
09-21 15:38:13.259: W/dalvikvm(3210):        15 of byte[] (9 elements) (15 unique instances)
09-21 15:38:13.259: W/dalvikvm(3210):        40 of byte[] (10 elements) (40 unique instances)
09-21 15:38:13.259: W/dalvikvm(3210):         3 of byte[] (11 elements) (3 unique instances)
09-21 15:38:13.259: W/dalvikvm(3210):        17 of byte[] (12 elements) (17 unique instances)
09-21 15:38:13.259: W/dalvikvm(3210):         7 of byte[] (14 elements) (7 unique instances)
09-21 15:38:13.259: W/dalvikvm(3210):         8 of byte[] (15 elements) (8 unique instances)
09-21 15:38:13.259: W/dalvikvm(3210):        15 of byte[] (16 elements) (15 unique instances)
09-21 15:38:13.259: W/dalvikvm(3210):         8 of byte[] (17 elements) (8 unique instances)
09-21 15:38:13.259: W/dalvikvm(3210):        16 of byte[] (18 elements) (16 unique instances)
09-21 15:38:13.259: W/dalvikvm(3210):         3 of byte[] (21 elements) (3 unique instances)
09-21 15:38:13.259: W/dalvikvm(3210):         3 of byte[] (22 elements) (3 unique instances)
09-21 15:38:13.259: W/dalvikvm(3210):        17 of byte[] (24 elements) (17 unique instances)
09-21 15:38:13.259: W/dalvikvm(3210):         4 of byte[] (28 elements) (4 unique instances)
09-21 15:38:13.259: W/dalvikvm(3210):         8 of byte[] (30 elements) (8 unique instances)
09-21 15:38:13.259: W/dalvikvm(3210):         1 of byte[] (32 elements)
09-21 15:38:13.259: W/dalvikvm(3210):         4 of byte[] (33 elements) (4 unique instances)
09-21 15:38:13.259: W/dalvikvm(3210):         8 of byte[] (34 elements) (8 unique instances)
09-21 15:38:13.259: W/dalvikvm(3210):         5 of byte[] (36 elements) (5 unique instances)
09-21 15:38:13.259: W/dalvikvm(3210):         2 of byte[] (41 elements) (2 unique instances)
09-21 15:38:13.259: W/dalvikvm(3210):         3 of byte[] (42 elements) (3 unique instances)
09-21 15:38:13.259: W/dalvikvm(3210):         1 of byte[] (56 elements)
09-21 15:38:13.259: W/dalvikvm(3210):         4 of byte[] (66 elements) (4 unique instances)
09-21 15:38:13.259: W/dalvikvm(3210):         4 of byte[] (72 elements) (4 unique instances)
09-21 15:38:13.259: W/dalvikvm(3210):         2 of byte[] (82 elements) (2 unique instances)
09-21 15:38:13.259: E/dalvikvm(3210): Failed adding to JNI local ref table (has 512 entries)
09-21 15:38:13.259: I/dalvikvm(3210): "AsyncTask #2" prio=5 tid=16 RUNNABLE
09-21 15:38:13.259: I/dalvikvm(3210):   | group="main" sCount=0 dsCount=0 obj=0x41decfd8 self=0x776200
09-21 15:38:13.259: I/dalvikvm(3210):   | sysTid=3236 nice=10 sched=0/0 cgrp=bg_non_interactive handle=7541280
09-21 15:38:13.259: I/dalvikvm(3210):   | schedstat=( 0 0 0 ) utm=82 stm=70 core=1
09-21 15:38:13.259: I/dalvikvm(3210):   at libcore.icu.NativeConverter.openConverter(Native Method)
09-21 15:38:13.259: I/dalvikvm(3210):   at java.nio.charset.CharsetEncoderICU.newInstance(CharsetEncoderICU.java:71)
09-21 15:38:13.259: I/dalvikvm(3210):   at java.nio.charset.CharsetICU.newEncoder(CharsetICU.java:27)
09-21 15:38:13.259: I/dalvikvm(3210):   at java.nio.charset.Charset.encode(Charset.java:451)
09-21 15:38:13.259: I/dalvikvm(3210):   at java.lang.String.getBytes(String.java:870)
09-21 15:38:13.259: I/dalvikvm(3210):   at com.Cocoa.CocoaAndroidSDK.CocoaUnicodeConverter.UTF8_TO_UTF16(CocoaUnicodeConverter.java:16)
09-21 15:38:13.259: I/dalvikvm(3210):   at com.Cocoa.CocoaAndroidSDK.CocoaSDKNativeLib.load(Native Method)
09-21 15:38:13.259: I/dalvikvm(3210):   at com.Cocoa.CocoaViewer.MainActivity$LongOperation.doInBackground(MainActivity.java:1498)
09-21 15:38:13.259: I/dalvikvm(3210):   at com.Cocoa.CocoaViewer.MainActivity$LongOperation.doInBackground(MainActivity.java:1)
09-21 15:38:13.259: I/dalvikvm(3210):   at android.os.AsyncTask$2.call(AsyncTask.java:264)
09-21 15:38:13.259: I/dalvikvm(3210):   at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
09-21 15:38:13.259: I/dalvikvm(3210):   at java.util.concurrent.FutureTask.run(FutureTask.java:137)
09-21 15:38:13.259: I/dalvikvm(3210):   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
09-21 15:38:13.259: I/dalvikvm(3210):   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
09-21 15:38:13.259: I/dalvikvm(3210):   at java.lang.Thread.run(Thread.java:856)
09-21 15:38:13.259: E/dalvikvm(3210): VM aborting
09-21 15:38:13.259: A/libc(3210): Fatal signal 11 (SIGSEGV) at 0xdeadd00d (code=1)

任何帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-21 15:21:29

还必须附加“其他”线程才能使用JIOManager。为什么不也找一个本地的参考资料呢?另一方面,您的崩溃转储表明,实际上您只查看3个类。因此,您可以只创建一次对这些线程的全局引用(即使在JNI_OnLoad()中也是如此),并从所有本机线程中使用它们。

票数 3
EN

Stack Overflow用户

发布于 2014-09-21 14:53:44

每个线程的本地引用的数量是有限制的,而且您已经超过了它。最常见的方法是在循环中创建本地引用,而不是在执行过程中删除它们。

当执行返回到VM时,本地引用会自动清除(并且几乎立即清除),因此简单地使用它的最佳方法就是让VM完成工作。但是,如果您正在创建超过16个本地引用,那么手动进行清理是个好主意。

FindClass的调用创建了一个本地引用。对NewGlobalRef的调用创建一个全局引用,而不破坏本地引用。您应该修改代码如下所示:

代码语言:javascript
复制
jclass temp = CJavaEnv::getInstance()->env()->FindClass(ioManagerName);
jclass JIOManager = (jclass)CJavaEnv::getInstance()->env()->NewGlobalRef(temp);
CJavaEnv::getInstance()->env()->DeleteLocalRef(temp);

除非显式销毁全局引用,否则不会销毁它们,所以要小心泄漏它们。当启用CheckJNI时,有几千个上限;没有CheckJNI,它们就可以不受约束地积累。

另见JNI提示

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25958854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档