2012-04-28 4 views
5

2つのネイティブライブラリを使用する必要があります.1つは自分のもので、もう1つはサードパーティです。私が別々のプロジェクトでそれらを使っていれば、すべては大丈夫でした。しかし、今私はException Ljava/lang/UnsatisfiedLinkErrorを得ています。Android NDKの複数(マイ・アンド・サードパーティ)ネイティブライブラリ

私はEclipseを使用しています。

libs/armeabiに既存のライブラリを置くと、Eclipseがネイティブコードのコンパイルを開始して失敗することが分かりました。コマンドラインからJNIの部分を再構築すると、コンパイルは成功しますが、サードパーティのライブラリは消えます。本当に馬鹿。

Eclipseをビルドする必要があるライブラリと共に既存の.soライブラリを使用するように指示するにはどうすればよいですか?ライブラリは独立しています。

答えて

7

NDKを使用すると、PREBUILT_SHARED_LIBRARY変数を使用して、事前ビルドされたユーザーライブラリとリンクすることができます。ちょうど作成し、その後

mkdir -p jni/libs 
cp librandom.so jni/libs 

jni/libs/Android.mkファイル:

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := random 
LOCAL_SRC_FILES := librandom.so 
include $(PREBUILT_SHARED_LIBRARY) 
をリンクする必要があるライブラリがlibrandom.soであると仮定すると

、プロジェクトフォルダのサブフォルダにjnilibsフォルダを作成

事前ビルドされたライブラリごとにセクションを作成できます。これらのライブラリはすべてjni/libsに配置されています。

次に、動作させるには、jni/Android.mkに上記のファイルを含める必要があります。 NDKのドキュメントでは、むしろ真ん中よりも、Android.mkの最後に行われることをお勧めします。

include $(LOCAL_PATH)/libs/Android.mk 

しかし、あなたはこのライブラリを必要とするモジュールの前にこれを実行する必要があります。

リンクするには、あらかじめビルドされたライブラリにリンクするモジュールセクションに以下を追加する必要があります。あなたはNDKビルドを行う際

LOCAL_SHARED_LIBRARIES := random 

はその後、それがモジュールをビルドする前にlibs/armeabi/にこのライブラリをコピーし、あなたが行ってもいいです。

注:必須ヘッダーの問題は解決しません。ライブラリのヘッダーの場所を必要なモジュールの変数LOCAL_C_INCLUDESに追加する必要があります。

+0

更新:1つのライブラリが別のライブラリに依存する場合は、http://stackoverflow.com/questions/17688327/android-ndk-make-two-native-shared-libraries-calling-each-otherを参照してください。 – 18446744073709551615

3

これは私が現時点で行っていることです。私は自分の(この)答えを受け入れることはありません(それは不満足なものです)。

新しいプロジェクトを作成し、そこにすべてのJavaファイルをコピーしました。次に、私は古いプロジェクトと第三者のライブラリの.soライブラリをlibs/armeabiにコピーしました。

これは怪物です。しかし、それは動作します。今のところは。最悪のことは、バージョンコントロールが激しくなっていることです。