JNIは、サードパーティのライブラリ(androidstudio)が付属しました
ライブラリが提供する他の部門をフックする必要があるので、最近では、プロジェクトをやって、アンドロイドの純粋な白、インターネット情報の束を見つけ、そして最終的に回り道をたくさん取るためには、あなたと共有し初期の成功、全体のプロセスを連結式
基本的なツール
androidstudio、公式の開発ツール、反復バージョンの多くをグーグル、そして実際に多くの欠点がありますが、多くの開発者が容易にそれを行います。
基本的な土台
ライブラリが搭載されているので、C ++コンパイラ、C ++の基本的なニーズは、基本的な知識は、JNIはまた、いくつかを知っておくべきではなく、子供の靴は、他の情報を確認するために行くことができますので、どのように深いJNIメモリメカニズムを学習する必要はありません、変換を入力する方法を学びました同じテーマに関する。
プロジェクトの設立の最初のステップ
androidstudioところ、はい、androidstudio自身の例では、ネイティブC ++プロジェクトを確立します。
CMkelistを製造する第二工程
ここandroidstudioディレクトリ構造は、単に固定フォーマットに従って、作業が複雑ではありませんどのくらい、このTXTファイルの内部に集中している、と言うのメイン-CPP CMakelistというディレクトリにファイルを開いて、androidstduioすべての業務プロセスを担当することではありません塗りつぶしは、androidstudioは自動的ので、静的、動的リンクライブラリファイルを生成するには、コマンドを実行します。
add_library( # Sets the name of the library.
native-lib
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
native-lib.cpp )
これは、AndroidベースのプログラミングはCを必要とする理由である、サードパーティのライブラリはここに関与している呼び出し、ローカル、ネイティブlib.cppあなた自身のコンパイルのcppファイルを変更することができるものは何もありませんので、生成された独自のライブラリです++理由。
find_library( # Sets the name of the path variable.
log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
log )
これは何も言うことがない、変更することなく、ここに位置決めLIBの場所があります。
私たちは自分自身を追加する必要があります次
target_include_directories(native-lib
PRIVATE
${CMAKE_SOURCE_DIR}/include
)
これは、ヘッダファイルを追加して、プロジェクトファイルの先頭を知らせることです。
add_library( # Sets the name of the library.
abc
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
IMPORTED)
set_target_properties(abc
PROPERTIES IMPORTED_LOCATION
${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libabc.so)
addlibraryは、サードパーティのライブラリを追加し、サードパーティのライブラリの種類を知らせる、SHAREDは、STATICが静的ライブラリで、静的ライブラリです。
set_target_propertiesは、サードパーティのライブラリの場所を知らせるためにある、$ {} ANDROID_ABI自動的なarm64-v8aとして、携帯電話のアーキテクチャを得ることです。
あなたは、複数のサードパーティのライブラリをインポートするにはどうすればよい、それはset_target_propertiesは()に追加していく、)add_library(に従ったものです。
target_link_libraries( # Specifies the target library.
native-lib abc abc1 abc2
# Links the target library to the log library
# included in the NDK.
${log-lib} )
最後target_link_libraries()、すべてのサードパーティのライブラリは、当社独自のネイティブ-libのライブラリに接続します。
第3のステップはネイティブlib.cppファイルをコンパイルすることです
ここでは、サードパーティのメソッドを呼び出すことができ、第三者ヘッダファイルのインポートになります。
int sum(int i,int j)
{
return i+j;
}
例えば、このようなサードパーティのライブラリ関数、我々はそれがパッケージ化された機能のjavaになりたいです
extern "C" JNIEXPORT jint JNICALL
Java_com_example_test_math_sum(JNIEnv* env,jobject /* this */,jint i ,jint j)
{
jint sum_ = i+jj
return sum_;
}
JNI仕様を関数として定義され、関数名は、名前+ +設定機能名は、パラメータがJNIタイプを渡さなければならないクラスのパッケージの名前は、パラメータはまた、INTと直接JINTに、JNI型ながら戻らなければなりません変換は、関数型変換処理を省略する。
package com.example.test;
public class math{
static {
System.loadLibrary("native-lib");
}
public int java_math(int i,int j)
{
return load(i,j);
}
public native long math(int i ,int j);
}
対応する機能は、優れたパッケージにC ++()関数のような単純な実装のJavaの数学に対応する当社のJavaクラスでもありますが。