web-dev-qa-db-ja.com

既存のC ++ライブラリ(.aまたは.soファイル)ndk android

Androidでネイティブ開発を行ったところです。 AndroidStudio 2.2.2ネイティブ開発の準備ができました

サンプルもビルドしますhello-jniプロジェクト

私が達成しようとしていること

C++で設計された既存のライブラリを使用しようとしています(静的ライブラリ。a拡張または。soファイルが提供されます)

ネイティブ開発に関する混乱はほとんどありません

1)。aまたは。so fileの代わりに、既存のc ++ライブラリの.cppおよび.hファイルを使用しますか?

2)CMakeLists.textを作成する必要がありますか?。aファイルをグーグルで調べた限り、ndk-buildを使用して生成されません私はそれをする必要があります。

。cpp&.h filesを使用する場合、Android.mkApplication.mkを作成する必要があります

CMakeLists.text新しく開発したAndroidプロジェクトをライブラリとして、または既存の。aファイルとしてコンパイルしますか?

3)プロジェクトの。aファイルはどこに置きますか。 jni folder?の下にありますか?

4)my Java=クラスファイルはkeyword nativeでメソッドを定義する必要があります。c++ファイルで実装されているものと同じです(例:c ++ファイルではメソッド名getData()、 JavaパブリックネイティブgetData()を含むクラス))

13
karthik kolanji

わかりましたので、たくさんの質問があります。これらの質問の一部は個人的な好みのタイプですが、個人的な選択として提供します。

1

これはあなたの選択です。個人的には、コンパイル済みの_.so_ファイルを使用します。このように、NDK、CMake、および.mkファイルについて心配する必要はありません。ファイルがある場合は、ファイルをlibsフォルダー(libフォルダーではなく)に追加し、_build.gradle_ファイルに小さな変更を加えるだけです。それでおしまい。

Build.gradleに変更します。

_sourceSets {
    main {
        manifest.srcFile 'AndroidManifest.xml'
        Java.srcDirs = ['src']
        res.srcDirs = ['res']
        assets.srcDirs = ['assets']
        jniLibs.srcDirs = ['libs']
    }
}
_

2と3

これらはこのオプションとは無関係です。

4

ファイルまたはコンパイル済みライブラリを使用する場合でも、このようなことをする必要があります。

_@SuppressWarnings("JniMissingFunction")
public class MyNativeMethods {
    static {
        System.loadLibrary("my_native_lib");
    }

    public native int native_method_1(int fd);
    public native int native_method_2(int fd);
    public native void native_method_3(int fd, int arr[]);
    public native int[] native_method_4(int fd);
}
_

そして、Activity/Fragmentからこれらのメソッドを呼び出すことができます。

これが十分に明確であることを願っています。

EDIT(以下のコメントに基づく)

1)_.so_または_.a_ファイルはネイティブライブラリです。

2)_.cpp_、_.c_などのファイルは、単なるネイティブソースコードファイルです。プロジェクトでそれらのファイルを使用する場合、ビルドシステム(CMakeなど)を使用して使用する必要があります。 CMakeはソースコードファイルを取得し、再びネイティブライブラリである_.so_ライブラリを作成します。これが、_.so_ファイルを使用することを提案した理由です。なぜなら、必要のないときにプロジェクトにCMakeを実装する作業を行うのはなぜですか?

CMakeを試してみたい、または将来的に学習したい場合は、この答えを確認してください: C/C++ with Android St​​udio version 2.2

3)System.loadLibrary("my_native_lib");:ここでは、Javaランタイムにこの特定のライブラリを追加するように指示しています。このようにして、Javaとライブラリ内にあるC++コードとの間にリンクを作成しています。その行の下のメソッドは、C++/Cコードでの名前と同じ名前にする必要があります。この方法でJavaランタイムはライブラリを見つけて開き、ロードしたライブラリでそれらのメソッドを探します。もっと見る こちら

から ここ

APKから直接共有ライブラリを開く

APIレベル23以降では、APKから直接.soファイルを開くことができます。 System.loadLibrary( "foo")を通常とまったく同じように使用しますが、AndroidManifest.xmlでAndroid:extractNativeLibs = "false"を設定します。古いリリースでは、インストール時にAPKファイルから.soファイルが抽出されました。これは、APKのスペースとインストールディレクトリのスペースを占有することを意味しました(これはあなたに対してカウントされ、アプリが占有するスペースとしてユーザーに報告されました)。 APKから直接読み込むすべての.soファイルは、Zipファイル内で(4096バイト境界で)ページ調整され、非圧縮で保存される必要があります。 zipalignツールの現在のバージョンでは、位置合わせが行われます。

APIレベル23以上では、dlopen(3)はAPKだけでなく、Zipファイルからライブラリを開くことに注意してください。 dlopen(3)に「my_Zip_file.Zip!/libs/libstuff.so」という形式のパスを指定するだけです。 APKの場合と同様に、これを機能させるには、ライブラリをページに合わせて圧縮せずに保存する必要があります。

1
not2qubit

これはあなたを助けるかもしれません プロジェクトにCおよびC++コードを追加

0
CLIFFORD P Y