2011-12-04 4 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) /data/data/com.example.hellojni/lib/ 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 WARN/dalvikvm (8086) : 참조 테이블 오버 플로우 (최대 = 1024) 12-04 14 : 46 : 36.431 : WARN/dalvikvm (8086) : JNI 로컬의 마지막 10 개 항목 참조 테이블 : 12-04 14 : 46 : 36.431 : 경고/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 : 경고/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 : 경고/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 : 경고/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 바이트) 12-04 14 : 46 : 36.431 : 경고/dalvikvm (8086) : 1022 : 0x4052b458 cls = Ljava/lang/String; (28 바이트) 12-04 14 : 46 : 36.431 : WARN/dalvikvm (8086) : 1023 : 0x4052b498 cls = Ljava/lang/String; (1024 엔트리) : 12-04 14 : 46 : 36.431 : WARN/dalvikvm (8086) : 1 요약 정보 (1024 항목) : JNI 로컬 참조 Ljava/lang/Class; 236B 12-04 14 : 46 : 36.431 : WARN/dalvikvm (8086) :
Ljava/lang/Class 중 하나; 284B 12-04 14 : 46 : 36.431 : WARN/dalvikvm (8086) :
Ljava/lang/Class 중 하나; 572B 12-04 14 : 46 : 36.431 : WARN/dalvikvm (8086) : 1020 of Ljava/lang/String; 28B (1020 고유) 12-04 14 : 46 : 36.431 : WARN/dalvikvm (8086) : 1 중 [Ljava/lang/String; 28B 12-04 14/46 : 36.431 : 경고/dalvikvm (8086) : 추적 한 내용이 직접적으로 보유하는 메모리 ref는 29680 바이트입니다. 12-04 14 : 46 : 36.431 : ERROR/dalvikvm (8086) : 실패 함 JNI 로컬에 추가 ref 테이블 (1024 항목 있음) 12-04 14 : 46 : 36.431 : 정보/dalvikvm (8086) : "주"prio = 5 tid = 1 RUNNABLE 12-04 14 : 46 : 36.431 : 정보/dalvikvm (8086) : | 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 = 기본 핸들 = -1345006496 12-04 14 : 46 : 36.431 : 정보/dalvikvm (8086) : 에 com.example.hellojni.HelloJni.buildString (네이티브 메서드) 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++){ 

다음은 괜찮습니다.

어떻게 다음에 큰 번호로 for를 실행하려면이 코드를 다시 작성할 수 있습니까?

+0

루프의 목적은 무엇입니까? – Mat

+0

죄송합니다. 귀하의 질문을받지 못했습니다. 많은 코드와 너무 적은 텍스트. 당신이 달성하고자하는 것과 귀하의 문제가 무엇인지 정확하게 기술하십시오. – Robert

+0

JNI/Java에서 호출 된 C에서 다음주기에 대해 큰 실행을하고 싶습니다. – lacas

답변

0

UI 스레드에서이 메서드를 호출하는 경우 1 시간 동안 일시 중지됩니다.4 분 그리고 안드로이드는 5 초 동안 응답하지 않는 프로그램을 닫을 것입니다. 이것은 AsyncTask를 사용하거나 다른 스레드에서이 호출을 실행하는 데 도움이됩니다.

+0

ok, 어떻게 안드로이드를 닫지 않도록 다시 작성할 수 있습니까? 비동기? 또는 스레드? 또는 어떻게? (c thread 또는 java?) – lacas

+0

이 함수 호출 후에 UI 스레드에 액세스하려면 처리기 또는 AsyncTask – confucius

+0

스레드 클래스를 사용하여 UI 스레드에 액세스 할 수 없습니다. – confucius

0

하나의 JNI 함수 호출에 너무 많은 Java 객체를 할당합니다. Dalvik은 전체 개체 참조 테이블 (귀하의 경우 1024 개체)을 점유하고 있음을 알려줍니다. 따라서 Java 배열 또는 다른 방법을 사용하여 데이터를 저장하십시오.

NewStringUTF를 호출 할 때마다 문자열을 Java가 소유 한 메모리에 복사하고 Java 버전의 문자열 (및 Java 측에서 사용되는 메모리)을 관리하는 객체를 할당합니다. 위의 예에서 참조가 범위를 벗어나면 (예 : 네이티브 함수가 반환 될 때) Java가 할당 한 메모리가 해제되고 참조가 삭제됩니다.

로컬 참조가 객체와 메모리를 추적하기 위해 Java 측에 저장 될 때마다 테이블의 슬롯을 사용합니다. 이 테이블의 크기가 얼마나 클지 확신 할 수는 없지만 비교적 작고 32 개의 항목이있을 것이라고 확신합니다. 귀하의 경우 실제로는 1024 크고 (구현에 따라 다름)하지만 한도에 한계가 있습니다. 초과하는 경우 발생하는 충돌이 발생합니다.

이 문제를 해결하는 방법에 관해서는 로컬 참조를 적게 사용하는 것이 좋습니다. 코드 스 니펫 (snippet)에서 for 루프가 수행 할 작업은 명확하지 않지만, (char *)로 캐스트하면 코드가 실제로 수행하고있는 작업에 대한 기본적인 이해가 부족하다는 것을 알 수 있습니다. jstring으로 유지했다면 env-> DeleteLocalRef (...)를 호출하여 참조를 제거 할 수 있습니다. 어쨌든, 달성하고자하는 구체적인 것이 있다면 자세한 정보를 제공해주십시오.