7

この質問はよく聞かれているようですが、全員がEclipseを使用してAPK内にライブラリをパッケージ化しようとしていました。ただし、私の要件は、Androidビルドシステムを使用してAPK内にライブラリをパッケージ化することです(後でJavaを介してSystem.loadLibrary()を使用してロードされます)。つまり、このジョブを実行するAndroid.mkファイルを作成します。

要件:1。ビルド済みの共有ライブラリ:libTest.so2.apk内のlibs/armeabi-7にこれをパッケージ化するAndroid.mkファイルを記述します。

使用しているビルドシステムについてはよくわかりませんが、必要な環境変数をエクスポートした後、「mm」コマンドを使用してコンパイルを実行します。

LOCAL_JNI_SHARED_LIBRARIESにlibTestを提供すると、エクスポートされたパス内でそれを見つけようとしますが、そこで見つけられないため、ビルドが失敗します。

誰かが私のプレビルド共有ライブラリをAPKにパッケージ化するAndroid.mkファイルを書くためのポインタを教えてもらえますか?

4

3 に答える 3

3

ネイティブライブラリを事前に構築するには、次のことを行う必要があります

  1. jniプロジェクトフォルダにフォルダを作成します
  2. libsプロジェクトフォルダにフォルダを作成します
  3. Adnroid.mkmakeファイルをjniフォルダーに追加します。次のようになります。

    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    LOCAL_LDLIBS    := -llog
    LOCAL_MODULE    := Test
    LOCAL_SRC_FILES := Test.cpp
    
    include $(BUILD_SHARED_LIBRARY)
    

注1:Test.cppは、ネイティブメソッドの実装を含むメインライブラリのソースファイルです。スペースで区切られたリストとしてソースを追加できます。

注2:ヘッダーは含めないでください。ヘッダーは自動的に含まれます。

注3:C ++ STLを有効にする必要がある場合は、別のmakeファイルを作成します- 、それをフォルダーApplication.mkに追加し、フラグを設定します。jniAPP_STL := stlport_static

次に、ビルダーを設定する必要があります。これを行う方法については、この記事を参照してください。

これらの手順の後、ビルダーは、libsアプリケーション全体をビルドするときにapkに自動的にパックされるフォルダーにライブラリを作成します。

注:ライブラリ名は小文字である必要があります。これはLinuxの規則です。「lib」プレフィックスが自動的に追加されるため、最終的なライブラリ名はlibtest.soになります。

于 2012-01-12T13:42:50.327 に答える
1

プロジェクトの下にapkにパックしたいlibxxx.so共有ライブラリが1つあるとしましょう。libs/armeabi/以下のようにあなたがする必要がある2つのことがありAndroid.mkます:

# 1. Copy .so to out/target/product/***/obj/lib
$(shell cp $(wildcard $(LOCAL_PATH)/libs/armeabi/*.so $(TARGET_OUT_INTERMEDIATE_LIBRARIES)) 

# 2. Make libxxx to be packed into apk
LOCAL_JNI_SHARED_LIBRARIES := libs/libxxxx


次に、apktoolを使用してビルドされたapkを解凍できます。これは、libxxx.soにありlibs/armeabi*/ます。それは確かにapkに詰め込まれています。

于 2012-11-25T03:58:34.190 に答える
1

APKに組み込みたいLOCAL_JNI_SHARED_LIBRARIESが2つありました。私はAndroid.mkで次のように設定することでそれを行うことができます:

LOCAL_MODULE_TAGS := samples

モジュールを再コンパイルした後、/lib/の下の.apk内に両方のライブラリを見つけることができました。

于 2021-02-17T16:34:38.877 に答える