0

このリンクlink1link2に示されているように、私は(APV pdfビューア)を使用しています

とにかくそれはうまくいきます。しかし、プロジェクトを通じてパッケージの名前を変更すると、次の例外が発生します。

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();
}
}

助けてください?前もって感謝します。

4

1 に答える 1

0

このエラーは、AndroidDalvik仮想マシンが特定のJavaクラス/メソッドに必要なネイティブライブラリを見つけることができないことを意味します。ネイティブライブラリを正しく構築してください。ネイティブライブラリが正しく作成されていて、問題なく読み込まれることが確実な場合は、Android / DalvikのバグまたはNDKのバグのいずれかです...ただし、これは非常にまれです。この質問はAPVのユーザーグループで何度も聞かれますが、通常、この質問をする人はJNIの基本を知らないためです。

それでもこの問題を解決する方法がわからない場合は、Java用とAndroid用(android-ndkを使用)の基本的なJNI "hello、world"アプリケーションを作成し、少し試してみることをお勧めします。これで問題が解決するはずです。

申し訳ありませんが、このエラーはAPV自体とは関係ありません。APVはここでは特定の不可解な魔法を実行しません。他の多くのアプリで使用されている標準の実証済みテクノロジー(JNI)を使用しているだけです。

Javaがネイティブメソッドを見つけて呼び出す方法の説明:http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/design.html#wp679

貼り付けたコードのpdfviewパッケージ名がpdfviewIktabに変更されました。それに応じてJNI(C)関数名を変更したことを確認してください。

于 2012-09-11T12:20:06.493 に答える