Android UnsatisfiedLinkError:使用APV的parseFile

时间:2012-09-10 13:21:08

标签: android android-intent pdfview apvpdf

我正在使用(APV pdf查看器),如此链接所示 link1& link2

无论如何它运作正常。但是,当我通过项目更改了包的名称时,它给出了以下异常:

09-10 22:02:35.936: E/AndroidRuntime(556): FATAL EXCEPTION: main
09-10 22:02:35.936: E/AndroidRuntime(556): java.lang.UnsatisfiedLinkError: parseFile
09-10 22:02:35.936: E/AndroidRuntime(556):  at cx.hell.android.pdfviewIktab.PDF.parseFile(Native Method)
09-10 22:02:35.936: E/AndroidRuntime(556):  at cx.hell.android.pdfviewIktab.PDF.<init>(PDF.java:87)
09-10 22:02:35.936: E/AndroidRuntime(556):  at cx.hell.android.pdfviewIktab.OpenFileActivity.getPDF(OpenFileActivity.java:569) 
09-10 22:02:35.936: E/AndroidRuntime(556):  at cx.hell.android.pdfviewIktab.OpenFileActivity.startPDF(OpenFileActivity.java:530)
09-10 22:02:35.936: E/AndroidRuntime(556):  at cx.hell.android.pdfviewIktab.OpenFileActivity.onCreate(OpenFileActivity.java:282)
09-10 22:02:35.936: E/AndroidRuntime(556):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
09-10 22:02:35.936: E/AndroidRuntime(556):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
09-10 22:02:35.936: E/AndroidRuntime(556):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
09-10 22:02:35.936: E/AndroidRuntime(556):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
09-10 22:02:35.936: E/AndroidRuntime(556):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
09-10 22:02:35.936: E/AndroidRuntime(556):  at android.os.Handler.dispatchMessage(Handler.java:99)
09-10 22:02:35.936: E/AndroidRuntime(556):  at android.os.Looper.loop(Looper.java:123)
09-10 22:02:35.936: E/AndroidRuntime(556):  at android.app.ActivityThread.main(ActivityThread.java:4627)
09-10 22:02:35.936: E/AndroidRuntime(556):  at java.lang.reflect.Method.invokeNative(Native Method)
09-10 22:02:35.936: E/AndroidRuntime(556):  at java.lang.reflect.Method.invoke(Method.java:521)
09-10 22:02:35.936: E/AndroidRuntime(556):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
09-10 22:02:35.936: E/AndroidRuntime(556):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
09-10 22:02:35.936: E/AndroidRuntime(556):  at dalvik.system.NativeStart.main(Native Method)

这是类(PDF.java):

package cx.hell.android.pdfviewIktab;

import java.io.File;
import java.io.FileDescriptor;
import java.util.List;
import cx.hell.android.lib.pagesview.FindResult;


public class PDF {
static {
    System.loadLibrary("pdfview2");
}


public static class Size implements Cloneable {
    public int width;
    public int height;

    public Size() {
        this.width = 0;
        this.height = 0;
    }

    public Size(int width, int height) {
        this.width = width;
        this.height = height;
    }

    public Size clone() {
        return new Size(this.width, this.height);
    }
}


private int pdf_ptr = -1;
private int invalid_password = 0;

public boolean isValid() {
    return pdf_ptr != 0;
}

public boolean isInvalidPassword() {
    return invalid_password != 0;
}

synchronized private native int parseFile(String fileName, int box, String password);

synchronized private native int parseFileDescriptor(FileDescriptor fd, int box, String password);

public PDF(File file, int box) {

 // this is the line of (cx.hell.android.pdfviewIktab.OpenFileActivity.getPDF(OpenFileActivity.java:569))
    this.parseFile(file.getAbsolutePath(), box, "");
}

public PDF(FileDescriptor file, int box) {
    this.parseFileDescriptor(file, box, "");
}

synchronized public native int getPageCount();

synchronized public native int[] renderPage(int n, int zoom, int left, int top, 
        int rotation, boolean gray, boolean skipImages, PDF.Size rect);

synchronized public native int getPageSize(int n, PDF.Size size);

synchronized public native List<FindResult> find(String text, int page);

synchronized public native void clearFindResult();

synchronized public native List<FindResult> findOnPage(int page, String text);

synchronized private native void freeMemory();

public void finalize() {
    try {
        super.finalize();
    } catch (Throwable e) {
    }
    this.freeMemory();
}
}

任何帮助,请?在此先感谢。

1 个答案:

答案 0 :(得分:0)

此错误表示Android Dalvik虚拟机无法找到给定Java类/方法所需的本机库。请正确构建本机库。如果已经正确创建了本机库并且您确定它应该没有问题加载,那么它是Android / Dalvik bug或NDK bug ...但是这是极不可能的。 APV的用户群已多次询问此问题,通常是因为提出这个问题的人不了解JNI的基础知识。

如果您还不知道如何解决这个问题,我建议您创建基本的JNI&#34; hello,world&#34;应用程序用于Java,然后用于Android(使用android-ndk)并稍微使用它。这应该为你解决问题。

很抱歉,但这个错误与APV本身无关,APV在这里没有任何特殊的神秘魔法,它只是使用许多其他应用程序使用的标准验证技术(JNI)。

Java如何查找和调用本机方法的说明:http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/design.html#wp679

您已粘贴的代码已将pdfview程序包名称更改为pdfviewIktab。确保您已相应更改了JNI(C)函数名称。