0

JNI を使用するライブラリを使用しようとしています。

開発者が提供するサンプルアプリを試してみましたが、うまくいきました。だから私はそれがライブラリのバグではないことを知っています。

ライブラリをインポートする過程で何か間違ったことをしていると思います:

  • .so ファイルを libs フォルダー (libjniRTSP.so と呼ばれる) にコピーします。
  • jniRTSP.java (以下に要約) をプロジェクトにコピーします。

    public class jniRTSP {
    
    private volatile static jniRTSP libRTSP = null;
    
    public static jniRTSP getInstance() {
        if(null == libRTSP) {
            synchronized(jniRTSP.class) {
                if(null == libRTSP) {
                    libRTSP = new jniRTSP();
                    libRTSP.InitProductList();
    
                    // DEBUG
                    libRTSP.SetDebugView(1);
                }
            }
        }
        return libRTSP;
    }
    
    static {
        try {
            System.loadLibrary("jniRTSP");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public native int       GetBrandEnableRecorder();
    public native int       GetBrandEnableLocal();
    public native int       GetBrandEnableRemote();
    ...
    
  • 次に、 onCreate() でメソッドの 1 つを呼び出そうとします。

    jniRTSP.getInstance().Init(.....)
    

    エラーを返します:

    UnsatisfiedLinkError: ネイティブ メソッドが見つかりません com.myuniquepackage.jniRTSP.InitProductList:()I

更新 (修正): jniRTSP Java ファイルをコピーするだけでなく、それを含むパッケージ全体を同じパッケージ名のままコピーしました。パッケージ名が問題だったためにこれが修正されたのか、それともそのパッケージに含まれていた他のJavaファイルの1つが必要だったのかはわかりません。ファイルが見つからない場合はかなり確信がありますが、コンパイル時に文句を言うでしょう。

4

1 に答える 1

2

パッケージ宣言は、C コード内で Java コードと同じでなければならないことはほぼ確実です。

したがって、クラス jniRTSP は Java の com.myuniquepackage パッケージ内にあり、ネイティブ メソッド InitProductList が宣言されている必要があり、C コードにはメソッドが Java_com_myuniquepackage_jniRTSP_InitProductList として宣言されている必要があります。

おそらくリンクを壊しているクラスを移動することで、Java のパッケージ宣言をデモ プロジェクトに合わせて変更し、動作するかどうかを確認します。動作する場合は、元に戻してから、C コードで変更しますが、これにはもう少し時間がかかります消費しますが、十分に簡単です。

于 2013-10-15T23:42:46.010 に答える