Androidがサードパーティ製SOライブラリを呼び出す方法

5211 ワード

Androidがサードパーティ製SOライブラリを呼び出す方法既知の条件:SOライブラリはAndroidバージョンの接続ライブラリ(*.soファイル)であり、詳細なインタフェースの説明を提供しています.解決策:1.SOファイルをlibs/armeabiの下に直接置いて、コードの中でSystem.loadLibrary("xxx");再public native static int xxx_xxx_xxx();次にxxxを直接呼び出すことができます.xxx_xxx()メソッド;2.第二の方案は、自分のSOファイルを作成し、自分のSOファイルの中で第三者のSOを呼び出し、更にプログラムの中で自分のSOを呼び出す.hファイルは、Cソースファイルincludeを作成する前に生成する.hファイルは相応の方法を実現し、最後にandroid NDK開発パッケージのndk-buildスクリプトで対応を生成する.so共有ライブラリ;解:1.上の2つの案は可能ですか?できないなら何か問題がありますか?2.二つの案の違いは何ですか.なぜネット上の大部分が2つ目の案を使っているのですか?3.一つだけ*soファイルは、ANDROIDで使用できるかどうかの詳細なインタフェースの説明を提供しています.
 
まず、このSOがJNI仕様のSOであるかどうかを見てみましょう.例えば、JNIが直接サポートしていないタイプに戻るかどうかを見ます.つまりこのSOは直接JNIとして呼び出せるかどうか.答えが否定的であれば、2つ目の案を選ぶしかありません.
もし答えが肯定的であれば、このSOのライブラリがJAVA層に直接露出することを望んでいるかどうかを見なければなりません.もし答えが否定的であれば、あなたは2つ目の案を選ぶしかありません.例えば、あなた自身もライブラリの提供者です.
普通はもしあなたがSOだけあるならば、これが他の人があなたに提供したのだと説明して、あなたは相手にセットのJAVA呼び出しファイルを提供するように要求することができます.
1、これはこのSOがJNI呼び出しの仕様に合っているかどうかによって決まります.あなた自身の意思も見なければなりません.
2、第2の方法が最も柔軟であるため、様々な状況が実現できる.
3、いいですよ
 
JAVAから直接呼び出せるかどうかを見る最も簡単な方法は、SOの関数名がJavaかどうかを見ることです.XXX_XXX_XXX形式
はい、あなたは自分でセットのJAVAファイルを書くことができて、SO関数名とJAVA関数名の変換規則に注意して、あるいはSO提供者に要求します;
そうでなければ、二つ目の案を選びましょう.
 
1、必要書類が揃っているかチェックする
サードパーティ製ダイナミックライブラリを使用するには、少なくとも2つのファイルが必要です.1つはダイナミックライブラリ(.so)で、もう1つは
ダイナミックライブラリAPI宣言ヘッダファイル(.h)
2、パッケージング原動状態ライブラリ
元のダイナミックライブラリファイルにはjniインタフェースに必要な情報が含まれていないので、カプセル化する必要があります.
我々のニーズはlibadd.soの中のAPIはjniインタフェース付きのダイナミックにカプセル化されている
3、ライブラリのパッケージ関数libaddjniを作成する.c
前に生成したcom_に基づいてandroid_libjni_LibJavaHeader.hファイル、libaddjniを作成します.c,用
libaddjniを生成しますso
 
 
Androidにサードパーティ製パッケージ(.jar,.so)を統合
Androidではサードパーティ製のパッケージが使用される可能性があります.これにはJavaパッケージが含まれています.JArとNativeパッケージso.JArパッケージは、Eclipse開発環境統合によっても、ソースコード統合をコンパイルすることによっても、あなたの作業環境を見ることができます.
 
自分が開発したプログラムがMyMapsであると仮定すると、baidumapiを含むBaiduMapsのライブラリが必要である.JArとlibBMapApiEngine_v1_3_1.so.
 
一、Eclipseにサードパーティjarパッケージを集積する.soダイナミックライブラリ
 
MyMapsプロジェクトの下でディレクトリlibsとlibs/armeabiを作成し、baidumapi.JArが置かれているlibs/ディレクトリの下にlibBMapApiEngine_v1_3_1.soはlibs/armeabi/の下に置く.
 
Eclipseでサードパーティjarパッケージbaidumapi.JArをMyMapsにパッケージするには:
 
1.工事を右クリックし、Propertiesを選択する.
2.Java Build Path、Librariesを選択します.
3.Librariesページ右ボタン「Add Library...」をクリックします.
4.「User Library」を選択し、「Next」をクリックする.
5.「User Libraries」ボタンをクリックする.
6.ポップアップ画面で、「New...」をクリックします.
7.「User library name」と入力し、「OK」をクリックして確認する.
8.戻ってきたら、作成したばかりのUser libraryを選択し、右側に「AddJARs」をクリックします.
9.MyMaps/libs/のbaidumapiを選択します.jar;
10.確認、戻ります.
 
これにより、コンパイル後、このjarパッケージがMyMapsに打ち込まれる.apkでlibBMapApiEngine_v1_3_1.soもlib/armeabi/にパッケージされている.
プログラム実行中、libBMapApiEngine_v1_3_1.soは/data/data//lib/の下に置かれ、動的ライブラリをロードするとプログラムのlib/ディレクトリから検索される.soライブラリ.
 
二、ソースコードに第三者集積jarパッケージを集積する.soダイナミックライブラリ
 
AndroidソースコードのMyMapsはpackages/appsの下に置かれています.MyMapsでディレクトリlibsおよびlibs/armeabiを作成しbaidumapi.JArをlibs/,libBMapApiEngine_v1_3_1.soはlibs/armeabiに置く.
 
2.1 Androidの修正mkファイル
 
Android.mkファイルは次のとおりです.
 
LOCAL_PATH:= $(call my-dir)  
include $(CLEAR_VARS)  
   
LOCAL_MODULE_TAGS := optional  
   
LOCAL_STATIC_JAVA_LIBRARIES := libbaidumapapi  
   
LOCAL_SRC_FILES := $(call all-subdir-java-files)  
   
LOCAL_PACKAGE_NAME := MyMaps  
   
include $(BUILD_PACKAGE)  
   
##################################################  
include $(CLEAR_VARS)  
   
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :=libbaidumapapi:libs/baidumapapi.jar  
LOCAL_PREBUILT_LIBS :=libBMapApiEngine_v1_3_1:libs/armeabi/libBMapApiEngine_v1_3_1.so  
LOCAL_MODULE_TAGS := optional  
include $(BUILD_MULTI_PREBUILT)  
   
# Use the following include to make our testapk.  
include $(callall-makefiles-under,$(LOCAL_PATH))  

 
 
1統合jarパッケージ
LOCAL_STATIC_JAVA_LIBRARIESはjarライブラリの別名を取り、任意に値を取ることができる.
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIESはprebuiltjarライブラリのルールを指定します.フォーマット:別名:jarファイルパス.注:別名は必ずLOCAL_STATIC_JAVA_LIBRARIESで取る別名は一致し、含まない.jar;JArファイルパスは、サードパーティのjarパッケージを実際に保存するパスでなければなりません.
コンパイル用BUILD_MULTI_PREBUILT.
2統合soダイナミックライブラリ
LOCAL_PREBUILT_LIBSはprebuilt soのルールを指定し、フォーマット:別名:soファイルパス.注意:別名は一般的に変更できない、特にサードパーティjarパッケージで使用される.soライブラリの場合、含まない.so;soファイルパスは、サードパーティのsoファイルを実際に保存するパスでなければなりません.
コンパイルコピー用BUILD_MULTI_PREBUILT.
 
2.2 GRANDFAATHERED_への参加USER_MODULES
 
ファイルuser_tags.mkでlibBMapApiEngine_をv1_3_1 GRANDFAATHERED_に追加USER_MODULES中
 
GRANDFATHERED_USER_MODULES += \  
    … \  
    libBMapApiEngine_v1_3_1  

 user_tags.mkはbuild/coreの下でもよいし、$(TARGET_DEVICE_DIR)の下でもよいし、$(TARGET_DEVICE_DIR)の下での修正を推奨する.
 
2.3コンパイル結果
 
MyMaps.apkコンパイルはout/target/product//system/app/の下に生成される.
libBMapApiEngine_v1_3_1.soはout/target/product//system/lib/の下に置かれ、これもシステムがダイナミックライブラリをロードしたときに検索するパスです.