を使用して Android NDK によって生成された最終的な共有ライブラリを、ARM アーキテクチャ用に既にコンパイルしたndk-build
と言った PDF 共有ライブラリにリンクする必要があります。(これが事実であることを確認してください。そうでない場合、ライブラリは Android で動作しません! )
たとえば、次のディレクトリ構造があるとします。
jni
└── libs
└────── my_shared_lib.so
└── Android.mk
└── Application.mk
Android.mkファイル内に次のコンテンツが必要です。
LOCAL_PATH := $(call my-dir)
# define our prebuilt shared library as a module to the build system
include $(CLEAR_VARS)
LOCAL_MODULE := mysharedlib
LOCAL_SRC_FILES := libs/my_shared_lib.so
include $(PREBUILT_SHARED_LIBRARY)
# The final shared library that will be bundled inside the .apk
include $(CLEAR_VARS)
LOCAL_MODULE := mynativelib
LOCAL_LDLIBS := -landroid -llog
LOCAL_CPPFLAGS := -O0 -g3 -std=c++11 -Wall -Wextra
LOCAL_SHARED_LIBRARIES := mysharedlib
LOCAL_C_INCLUDES := myheader1.h myheader2.h
LOCAL_SRC_FILES := src_file1.cpp src_file2.cpp
include $(BUILD_SHARED_LIBRARY)
およびApplication.mkファイルの内容 (C++ 標準ライブラリを使用し、ARM アーキテクチャの 2 つの異なるバージョン用の最終的な共有ライブラリをビルドするため):
APP_OPTIM := debug
APP_PLATFORM := android-14
APP_STL := gnustl_static
APP_ABI := armeabi armeabi-v7a
次に、Eclipse 内またはコマンド ラインからndk-buildスクリプトを使用してコードをコンパイルすると、最終的な共有ライブラリがコンパイルされ、ビルド済みの共有ライブラリ (つまり、使用しようとしていると述べた PDF 共有ライブラリ) にリンクされます。 .
共有ライブラリの場合、生成されてデバイス/エミュレーターにデプロイされる apk には、最終的な共有ライブラリと、リンクしたすべてのビルド済み共有ライブラリが含まれます。これは、apk 内にバンドルされていない静的ライブラリに対するリンクとは対照的です。
このユースケースでは、apk がデバイスで解凍された後、Android アプリケーションの lib ディレクトリに 2 つの共有ライブラリが必要です。これは、ターミナルから次のコマンドを実行して確認できます。
adb shell ls -l /data/data/com.company.myapp/lib
com.company.myapp をアプリケーションのパッケージ名に置き換えます。
また、Java クラスの静的コンテキスト内に次のものを入れることを忘れないでください。
class MyClass
{
static
{
try
{
System.loadLibrary("mynativelib");
}
catch (UnsatisfiedLinkError ule)
{
Log.e(TAG, "WARNING: Could not load native library: "
+ ule.getMessage());
}
}
// other code here...
}
System.loadLibrary メソッド呼び出し内で、最終的な共有ライブラリ名として同じ名前が使用されていることに注意してください。