2011-12-04 20 views
0
jstring Java_com_example_hellojni_HelloJni_buildString(JNIEnv *env, jobject sThis){ 
     for (int i=0; i < 100000; i++){ 
       char* c=(char*)env->NewStringUTF("xx"); 
     } 

     return env->NewStringUTF("test"); 
    } 

12-04 14:46:36.399:DEBUG/dalvikvm(8086):試圖加載LIB /data/data/com.example.hellojni/lib/ libhello-jni.so 0x405143d8 12-04 14:46:36.399:DEBUG/dalvikvm(8086):已添加共享庫 /data/data/com.example.hellojni/lib/libhello-jni.so 0x405143d8 12-04 14:46:36.431:WARN/dalvikvm(8086):引用表溢出(最大= 1024) 12-04 14:46:36.431:WARN/dalvikvm(8086):JNI本地最後10個條目 參考表:12-04 14:46:36.431:WARN/dalvikvm(8086):1014: 0x4052b258 cls = Ljava/lang/String; (28字節)12-04 14:46:36.431: WARN/dalvikvm(8086):1015:0x4052b298 cls = Ljava/lang/String; (28 字節)12-04 14:46:36.431:WARN/dalvikvm(8086):1016:0x4052b2d8 cls = Ljava/lang/String; (28字節)12-04 14:46:36.431: WARN/dalvikvm(8086):1017:0x4052b318 cls = Ljava/lang/String; (28 字節)12-04 14:46:36.431:WARN/dalvikvm(8086):1018:0x4052b358 cls = Ljava/lang/String; (28字節)12-04 14:46:36.431: WARN/dalvikvm(8086):1019:0x4052b398 cls = Ljava/lang/String; (28 字節)12-04 14:46:36.431:WARN/dalvikvm(8086):1020:0x4052b3d8 cls = Ljava/lang/String; (28字節)12-04 14:46:36.431: WARN/dalvikvm(8086):1021:0x4052b418 cls = Ljava/lang/String; (28 bytes)12-04 14:46:36.431:WARN/dalvikvm(8086):1022:0x4052b458 cls = Ljava/lang/String; (28字節)12-04 14:46:36.431: WARN/dalvikvm(8086):1023:0x4052b498 cls = Ljava/lang/String; (80 bytes)12-04 14:46:36.431:WARN/dalvikvm(8086) Ljava/lang/Class; 236B 12-04 14:46:36.431:WARN/dalvikvm(8086):
1/Ljava/lang/Class; 284B 12-04 14:46:36.431:WARN/dalvikvm(8086):
1/Ljava/lang/Class; 572B 12-04 14:46:36.431:WARN/dalvikvm(8086): Ljava/lang/String; 28B(1020 unique)12-04 14:46:36.431: WARN/dalvikvm(8086):1 of [Ljava/lang/String; 28B 12-04 14:46:36.431:WARN/dalvikvm(8086):通過跟蹤直接保存的內存 refs是29680字節12-04 14:46:36.431:錯誤/ dalvikvm(8086):失敗 添加到JNI本地參考表(具有1024個條目)12-04 14:46:36.431: INFO/dalvikvm(8086):「main」prio = 5 tid = 1 RUNNABLE 12-04 14:46:36.431: INFO/:| group =「main」sCount = 0 dsCount = 0 obj = 0x4001f1b8 self = 0xcee8 12-04 14:46:36.431:INFO/dalvikvm(8086):
| sysTid = 8086 nice = 0 sched = 0/0 cgrp = default handle = -1345006496 12-04 14:46:36.431:INFO/dalvikvm(8086):at com.example.hellojni.HelloJni.buildString(Native Method) 12-04 14:46:36.431:INFO/dalvikvm(8086):在 com.example.hellojni.HelloJni.onCreate(HelloJni.java:93)Andrjoid JNI簡單用於下一返回一個錯誤

怪異。如果我的下一個看起來是這樣的:

for (int i=0; i < 100; i++){ 

然後evrething ok。

我該如何重寫這段代碼才能運行下一個大數字?

+0

那個循環的目的究竟是什麼? – Mat

+0

對不起,但我不明白你的問題。代碼太多,文字太少。請準確描述你想要達到的目標以及你的問題。 – Robert

+0

我喜歡在C中運行下一個週期的大型運行,這從JNI/Java – lacas

回答

0

如果您從UI線程調用此方法,那麼它將暫停1。4分鐘和android會關閉任何程序,不響應5秒我的這可以幫助您嘗試使用AsyncTask或在另一個線程中執行此調用。

+0

調用好吧,我怎麼能重寫它不關閉android?異步?或線程?或者如何? (c線程還是java?) – lacas

+0

如果你想在這個函數調用後訪問UI線程,使用Handlers或者AsyncTask – confucius

+0

使用Thread類你不能訪問UI線程。 – confucius

0

您分配一個JNI函數調用了太多的Java對象。 Dalvik告訴你,你已經佔據了整個對象引用表(在你的情況下是1024個對象)。所以,使用Java數組或其他方式來存儲數據。

每次調用NewStringUTF時,它都會將您的字符串複製到Java所擁有的內存中,並將分配一個對象來管理字符串的Java版本(以及Java端使用的內存)。當你的引用超出範圍(在上面的例子中,當本地函數返回時),Java分配的內存將被釋放,引用將被刪除。

每一個本地參考被存儲在Java端時間(跟蹤對象和它的存儲器中),它使用一個時隙在表中。我不確定這張桌子有多大,但我敢肯定它相對較小,可能是32個參賽作品。在你的情況下,它實際上是1024大(具體實現),但無論哪種方式都有一個限制,如果超過它,你會遇到你遇到的崩潰。

在如何解決這個問題方面,以及明顯的規則是使用更少的本地引用。在你的代碼片段中,並不清楚for循環的意圖是什麼,但是轉換爲(char *)表明對代碼的實際操作缺乏基本的理解。如果將它保存爲jstring,則可以選擇隨後調用env-> DeleteLocalRef(...)來刪除引用。無論如何,請提供進一步的信息,如果有一些具體的事情你正在努力實現。