1

私はすでに何週間もこれに固執しています。

私はAndroidトレントクライアントでlibtorrentを使用しています。最近、マグネットリンクなどの新機能を追加したいと思いました。

すべてのネイティブ関数はで宣言されPROJECT_FOLDER/jni/libtorrent.h、で実装されPROJECT_FOLDER/jni/libtorrent.cppます。

これまでのところ、何も問題はありませんでしたが、最近、この新しい関数をlibtorrent.h次のように追加しました。

JNIEXPORT jstring JNICALL Java_com_my_package_LibTorrent_MagnetToTorrent
(JNIEnv *env, jobject obj, jstring MagnetLink, jstring TorrentFolder);

私はその実装をに追加しましたlibtorrent.cpp

JNIEXPORT jstring JNICALL Java_com_my_package_LibTorrent_MagnetToTorrent
(JNIEnv *env, jobject obj, jstring MagnetLink, jstring TorrentFolder) {
        //function code here
}

コードを実行ndk-buildしてコンパイルしました。

クラスではcom.my.package.LibTorrent、以前に他のネイティブメソッドを宣言したのと同じ方法で、次の宣言を追加しました。これは正常に機能しました。

public native String MagnetToTorrent(String MagnetLink, String TorrentFolder);

しかし、私がそれを呼ぶときはいつでも、私は得UnsatisfiedLinkError: MagnetToTorrentます。以前にネイティブ関数を追加したので、これは本当に奇妙です、そしてそれらはうまく機能しました。

どんな助けでも大歓迎です。ありがとうございました。

編集:で宣言されたすべての関数は次のようlibtorrent.hに囲まれていextern "C" {}ます:

#ifdef __cplusplus
extern "C" {
#endif
/*Function declarations*/
#ifdef __cplusplus
}
#endif
4

3 に答える 3

1

忘れてしまったチャンスはありますextern "C"か?

于 2012-10-29T20:49:46.433 に答える
1

私が見る唯一の理由は、ネイティブライブラリにシンボルがないことです。前回のライブラリの変更(あなたがあなたのために働いたと主張している)以来、あなたは偶然にビルドパスやビルドの他の側面を変更していませんか?「新しい」ライブラリは、Javaビルドが認識していない他の場所にビルドされていませんか?ライブラリファイル(.so?)を見つけて、エクスポートされたシンボル(dumpbin、objdump、nm、プラットフォームごとに異なります)がないか調べます。それが実際にJavaビルドがロードしている1つのライブラリであることを確認してください。

于 2012-10-30T09:13:17.500 に答える
0

私はついに何が悪かったのかを理解しました。私はこの行をに追加する必要がありましたjni/Application.mk

APP_ABI := armeabi armeabi-v7a

これにより、ネイティブコードもARMv7プロセッサ用に構築されます。これは、新しい電話にあるものです。

他のすべての回答は、同様の問題を抱えている他の開発者にも役立つはずです。それぞれに+1を付けました。アプリがスローされる原因となる可能性のあるその他の問題についてはUnsatisfiedLinkError、次のリンクが役立つ場合があります:http: //developer.android.com/guide/practices/jni.html#faq_ULE

于 2012-11-06T12:55:35.010 に答える