0

Android 2.3.3 で OpenCV 2.4.0 ネイティブ コードを使用したい。そのために、NDK リリース 8 を使用して、Windows 7 でスクリプトをlib.so使用して共有ライブラリをndk-build.cmdビルドしました。Eclipse を使用してプロジェクトを作成し、.apk ファイルをビルドしました。

ここに問題があります。Java コードで ) をUnsatisfiedLinkError使用して共有ライブラリをロードしようとすると、例外がスローされます。NDK のhello-jniサンプルでSystem.loadLibrary(同じことを試してみましたが、まったく問題なく動作します。

このページの指示に従って、プロジェクトを作成しAndroid.mkApplication.mkファイルを作成しました。

ここに私のJavaコードがあります:

package my.package.ocvtest1
// import android.foo.bar statements

public class OCVTest1 extends Activity
{

    public void onCreate(Bundle savedInstance)
    {
        super.onCreate(Bundle savedInstance)
        // code to display strings returned by native functions
    }

    public native String funtionName1();
    public native String functionName2();

    static
    {
        System.loadLibrary("ocvtest1");
    }

}

(Project dir)/jni/ocvtest1.cネイティブ関数を実装するファイルは次のとおりです。

#include <jni.h>

// Other header files and some global variables

jstring Java_my_package_ocvtest1_OCVTest1 (JNIEnv *ptr, jobject obj)
{
    // code here
}

jstring Java_my_package_ocvtest1_OCVTest1_functionName2 (JNIEnv *ptr, jobject obj)
{
    // code here   
}

// End of file

私はこの問題をグーグルで調べて解決策を試しましたが、それらの解決策を実装した後でもこの例外が発生します。これまでに試したすべてのことは次のとおりです。

libopencv_java.soおよびスタティック*.aライブラリ ファイルを(Project dir)/libsおよびフォルダにコピーしてダイナミック リンクを使用し(Project dir)/obj/local、Java ソース コードのスタティック ブロックを

static
{
    System.loadLibrary("opencv_java");
    System.loadLibrary("ocvtest");
}

OPENCV_LIB_TYPE:=STATIC以下のように追加して静的リンクを使用

include $(CLEAR_VARS)
OPENCV_LIB_TYPE:=STATIC
include (<Path to Opencv.mk>)

javah.exe my.package.OCVTest1動的リンクの使用中にコマンド プロンプトで実行することによって生成されるインクルード ヘッダー ファイル。

ファイル内の abi バージョン変数を に変更armeabi-v7aしました。armeabiApplication.mk

上記のすべての変更について、ライブラリ ファイルがアプリの lib フォルダーに読み込まれたことを確認するために、次のコマンドを実行しました。

adb push <path to library on disk> <path to /lib in app> 

これにより、ライブラリ ファイルが電話機の適切なディレクトリにコピーされました。

この修正をすべて試した後でも、この例外を解決できません。

4

1 に答える 1

1

libopencv_java.so および静的 *.a ライブラリ ファイルを (Project dir)/libs および (Project dir)/obj/local フォルダーにコピーして動的リンクを使用し、Java ソース コードの静的ブロックを

にコピーするだけですlibopencv_java.so(*.aファイルは必要ありません) (Project dir)/libs/armeabi-v7a

また、次のものがあります。

public native String funtionName1();

しかし、ネイティブの C コードには、次の関数しかありません。

jstring Java_my_package_ocvtest1_OCVTest1 (JNIEnv *ptr, jobject obj) // mistake?
jstring Java_my_package_ocvtest1_OCVTest1_functionName2 (JNIEnv *ptr, jobject obj)

最初の関数の名前が間違っているようです。

これで問題が解決するはずです。

于 2012-06-22T05:47:59.897 に答える