2017-03-12 4 views
0

Ich versuche, Zugriff auf PDF-Dateien in meiner App mit https://github.com/barteksc/PdfiumAndroid und Hinzufügen einiger Funktionen wie Suchen und Hervorheben mit Java und C++. Das Problem ist, dass ich immer einen Absturz bekomme, ohne Ausnahmedetails. In Debuggen fand ich SIGABRT (Signal SIGABRT) SIG: 9 FehleradresseAndroid JNI Native Absturz während der Garbage Collection SIG 9 bei Verwendung von Pdfium Bibliothek

debug info

Meine native Funktion ist

#include <fpdftext.h> 

JNIEXPORT jstring JNICALL Java_[my package]_PdfiumCore_nativeGetPageText(JNIEnv *env, jobject instance, jlong pagePtr) { 
unsigned short* buffer; 
FPDF_TEXTPAGE text_page = FPDFText_LoadPage((FPDF_PAGE) pagePtr); 
int len = FPDFText_CountChars(text_page); 
FPDFText_GetText(text_page,0,len,buffer); 
jstring txt = env->NewString(buffer, len); 
FPDFText_ClosePage(text_page); 
return txt; } 

Java-Funktion in PdfiumCore.java

public String getPageText(PdfDocument doc, int pageIndex) 
{ 
    String txt; 
    synchronized (lock) { 
     try { 
      txt = nativeGetPageText(openPage(doc,pageIndex)); 
      return txt; 
     }catch (Exception e) 
     { 
      Log.e("Error ",e.getMessage()); 
      return ""; 
     } 
    } 

} 

public long openPage(PdfDocument doc, int pageIndex) { 
    long pagePtr; 
    synchronized (lock) { 
     pagePtr = nativeLoadPage(doc.mNativeDocPtr, pageIndex); 
     doc.mNativePagesPtr.put(pageIndex, pagePtr); 

     return pagePtr; 
    } 

} 

Funktionsaufruf

Log.e("Page 0",pdfiumCore.getPageText(pdfDocument,0)); 

Die Funktion ruft die Daten ab, sobald die App abstürzt. Ich schätze das Problem ist, wenn der Garbage Collector versucht, den Pufferzeiger zu löschen, der in der FPDFText_GetText Funktion verwendet wird. aber ich weiß nicht, wie ich es lösen soll.

irgendein Vorschlag bitte.

Antwort

0

löste ich das Problem, indem Sie den Zeiger zu löschen, nachdem

in der JNI-Funktion, indem Sie den Code der Daten bekommen
JNIEXPORT jstring JNICALL Java_[my package]_PdfiumCore_nativeGetPageText(JNIEnv *env, jobject instance, 
                   jlong pagePtr) { 
jstring txt; 
FPDF_TEXTPAGE text_page = FPDFText_LoadPage((FPDF_PAGE) pagePtr); 
int len = FPDFText_CountChars(text_page); 
unsigned short *buffer = new unsigned short[len]; 
FPDFText_GetText(text_page, 0, len, buffer); 
txt = env->NewString(buffer,len); 
delete[](buffer); 
FPDFText_ClosePage(text_page); 
return txt;} 
Verwandte Themen