5

共有ライブラリである必要があるAndroidアプリケーションを開発しています。Linuxで(gccを使用して)同じライブラリを作成したので、Android(ARMプロセッサ)で同じ共有ライブラリをコンパイルしたいと思います。ただし、NDKはJNIのみをサポートします。ここで、JNIと直接対話せずに別の共有ライブラリを構築したいと思います。私はCファイルとヘッダーをたくさん持っているので、すべてに対してJNIを書くことはできません。ARMプロセッサ用のライブラリを構築したい。これどうやってするの?

my stuture is
  ----->JNI
     ---->myfile.c(jni c code)
      ----->android.mk(here i call my two shared lib)

       folder1
             --->include
             ----src
             ---->lib(here i will get my shared lib)
       folder 2
            ----->include
            ----->src
            ----->lib(here i will get my 2nd shared lib)

ここでは、共有ライブラリを個別にビルドしたいので、それを呼び出します。AndroidでJNIなしでシュレッドライブラリを構築することは可能ですか?

4

2 に答える 2

6

Android NDKは、それを使用して構築されたバイナリのJNI準拠の要件を設けていません。ただし、通常、AndroidアプリケーションはJavaで記述されており、ネイティブコンポーネントを使用する場合、自然な方法はJNIを使​​用することです。

Android.mkAndroid NDKは、リッチで使いやすいndk-buildコマンドを提供します。このコマンドでは、makeシステムで使用されるファイルを少なくとも1つ準備する必要があります。多くの場合、makefileに基づいてそのようなファイルを準備することは努力する価値があります。ただし、別のプラットフォームから移植するプロジェクトで高度な機能configureや機能を使用している場合は、NDKの公式ドキュメントで説明さCmakeれているように、完全にスキップしてAndroid.mk、NDKの一部であるスタンドアロンツールチェーンを使用できます。Androidは完全なLinuxglibcをサポートしていませんが、 bionicと呼ばれるサブセットをサポートしていることに注意してください。STLサポートも明らかではありません。7つのオプションのいずれかを選択する必要があります。

ここで停止し、共有ライブラリまたは実行可能ファイルを取得して、従来のLinuxの方法で使用できます。AndroidアプリケーションはすべてC++でビルドできます。

ただし、最も簡単なアプローチは、AndroidSDKを使用してJavaAndroidアプリケーションを構築し、JDKを介していくつかのネイティブメソッドを呼び出すことです。そのためのラッパー、つまりJNI関数をJavaにエクスポートし、非JNIライブラリを順番に.so呼び出すライブラリが必要になります。では、これらのライブラリをで参照できます。この部分には、次の質問が役立つ場合があります。メインプロジェクトのソースツリーの外部にあるndkビルドライブラリAndroid.mkLOCAL_SHARED_LIBRARIES

Javaコードにネイティブライブラリを「手動で」ロードする必要があります。システムローダーは、フォルダー内の未解決の参照のみを検索し/system/libます。

従来の場所は、ネイティブメソッドを使用するJavaクラスの静的コンストラクターです。ロードの順序は重要です。libone.soに依存しlibtwo.so、にlibjni.so依存しliboneている場合libtwoは、次のようになります。

{
  System.Load("two");
  System.Load("one");
  System.Load("jni");
}

また、Android SDKビルダーがAPKファイルを作成するときに、libs/armeabiまたはディレクトリ内のファイルを見つけることを確認する必要があります。libs-armeabi-v7a

于 2012-09-25T13:11:33.300 に答える
5

JNI特定のCコードを記述せずにネイティブライブラリを構築することが可能です。Android.mkライブラリ用にApplication.mkファイルを作成する必要があります。有効なmakefile準備ができているので、それを使用してを作成できますAndroid.mk

Application.mk次のようになります。

APP_OPTIM := release
APP_PLATFORM := android-7
APP_STL := gnustl_static
APP_CPPFLAGS += -frtti 
APP_CPPFLAGS += -fexceptions
APP_CPPFLAGS += -DANDROID
APP_ABI := armeabi-v7a
APP_MODULES := <put-the-name-of-your-library-here>

ndk-buildライブラリをコンパイルするために使用します。

于 2012-09-25T10:39:05.960 に答える