web-dev-qa-db-ja.com

NDK-生成された.soライブラリを別のプロジェクトで使用する方法

1つのプロジェクトで.soファイルをビルドして使用するためにndkを正常に使用しました。このライブラリを別のプロジェクトで使用する必要があります。そこにソースをコピーするのではなく、ライブラリを使用するだけです。

libs/armeabi/libcommon.soはプロジェクトルートにコピーアンドペーストしようとしても機能しません。libs/armeabiはAndroid生成されたパスです。

それを行うための最良の方法は何でしょうか?

Eclipse-Galileoとndk5を使用しています。

43
OceanBlue

私はこれを行う方法を考え出したので、他の誰かがそれに遭遇した場合に備えてここに投稿します。

  1. 共有するコード(Java JNIラッパー、ネイティブコード、.soライブラリ)を含む)は、別のプロジェクトにある必要があります。プロジェクト名を右クリックして、これをライブラリプロジェクトに変換します- ->プロパティ-> Android properties->チェックマーク「Is Library」。このプロジェクトは現在実行できませんが、他のプロジェクトから参照できます。

  2. 共有オブジェクトを使用するプロジェクトで、プロジェクト名を右クリックしてLibarrayプロジェクトへの参照を追加します->プロパティ-> Android properties-> Library/"Add"これにより、前の手順で作成されたライブラリプロジェクトが表示されます。

これで、異なるプロジェクト間で.soを簡単に参照できます。

20
OceanBlue

これをすべて行うはるかに簡単な方法があります。

事前に構築されたライブラリが「libprebuilt.so」と呼ばれているとしましょう

ビルド済みライブラリのみを含める新しいプロジェクトのプロジェクトフォルダーで、次のような操作を行います。

mkdir -p jni/libprebuilt
cp libprebuilt.so jni/libprebuilt

次に、jni/libprebuilt/Android.mkファイルを作成します。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := libprebuilt
LOCAL_SRC_FILES := libprebuilt.so
include $(PREBUILT_SHARED_LIBRARY)

その後、ndk-buildを実行すると、このライブラリがlibs/armeabi /にコピーされます...それだけです!

44
gnychis

すべてのJNI(Java Native Interface)関数名の中にパッケージ名があります(JNIEXPORT void JNICALL Java_com_myapp_myclass_funct)。したがって、ライブラリ内のこれらの関数の名前を変更して、再コンパイルする必要があると思います。または、アプリの外部パッケージとして使用することもできます。

7
Komi