0x00の紙のターゲット
ネイティブレベルのコード層と相互作用してみましょうJavaコード
ネイティブコードは、ファイルがSOでコンパイルされています
だから、最終文書のAPKファイルに
これを行うには、Baiduの検索をダウンロードするには、公式ウェブサイトに直接のAndroid NDKメーカーやスーツを必要としています。
0x01のJavaの層
JavaのJNI層を作るために、簡単なテストコードの層と相互作用。こんにちは、文字列を取得するために使用される方法は、ネイティブから返された、とのTextView、ライン上のレイアウトファイルでの新しいクラスメートがないのTextViewを表示します。
パッケージcom.example.androidtest。
輸入android.support.v7.app.AppCompatActivity。
輸入android.os.Bundle;
輸入android.widget.TextView。
パブリッククラスMainActivityはAppCompatActivity {拡張し
、民間のTextViewのtxt_jniを。
静的{
System.loadLibraryを( "試験")。
}
@Overrideは、
ボイドのonCreate(バンドルsavedInstanceState){保護
super.onCreate(savedInstanceState)を、
setContentView(R.layout.activity_main)。
txt_jni = findViewById(R.id.txt_jni)。
txt_jni.setText(ハロー(1、 "2"));
}
(列B INT)プライベートStringネイティブこんにちは。
}
JNIのソースフォルダを作成するには、Androidのメーカー、ファイル - >新規作成>フォルダ - > JNIフォルダに新しい空のプロジェクト、JNI /メイン/ srcに/のデフォルトのパスを作成するために、JNIコードを達成するために、次の層。
ブロガー別の記事ではSO生成された純粋なJavaファイルを示していますhttps://www.cnblogs.com/DXCyber409/p/10854415.html。
Java_固定パスモード、及びJNI_OnLoadを動的登録モード:アンドリュースは、同様に二つの方法を有しています。
0x02のJNI固定プレフィックス文言
基本的に、固定プレフィックスを生成する最後のC / cppのファイルにそれを実装するための名前とパラメータを機能。
.Hファイルは、手動ではないデモンストレーションを生成することができます。本明細書で使用する場合、外部ツールのAndroid Studioは大幅に開発効率を向上させます.Hヘッダーファイルを、生成されたキーを満たすために提供しています。
ファイル - >設定 - >ツール - > Extenalツールは、新しいエントリを作成するには、プラス記号を指します。コマンド命令は、実際に、組み合わせて書かれた手書きを渡されたコマンドラインパラメータを実行することができます。
D:\ RTEws \ Javaの\ binにjdk1.8.0_121 \> javahは-d "E:\ワークスペース\ NetBeansの\ DXCyber409 \ \メイン\のJava SRC \ dxcyber409 \ JNI" -classpath「E:\ワークスペース\ NetBeansの\ DXCyber409 \ターゲット\クラス」-jni dxcyber409.Test $のCl
お見逃しなく、Marcrosは、環境変数の参照ウィンドウを建設された挿入します。
次のように調整し、最終的なプログラムのパスのパラメータ:
名前:のjavah プログラム:$ JDKPATH $ \ javah.exe \ binに 引数:-d "$ ModuleFileDir $ \ \メイン\のJNI SRC" -classpath「$ OutputPath $; $ ModuleSdkPath $ \プラットフォームアンドロイド-28 \ \ android.jar。 $ ModuleSdkPath $ \エキストラアンドロイド\ androidの支援-v4.jar \; $ ModuleSdkPath $ \エキストラアンドロイド\ androidのサポート-v7.jar」-jni $ FileClass $ \ 作業ディレクトリ:
そのコードにコンパイルclassesディレクトリに加えて、-classpathオプション外の引数は、またandroid.jar参加し、実装クラスなしのアンドロイド・サポート・v4.jar、アンドロイド・サポート・v7.jarおよびその他の依存関係は、不足しているとエラーされます。
複数の書かれた、ブロガーの引数は、ライン上で空白のまま何も行われ、その作業ディレクトリをステッチ、関連するすべてのパスに置かれています。
PS。ブロガーのAndroid SDK一見不完全な方法は、AndroidのSDK APPCOMPAT依存パッケージで見つけることができません。あなたは、Android SDKを再インストールしたくない場合は、少しスキルが漢漢のMavenのリポジトリの欠如を下げるために、そこにある、自分で服を着ました。ラインで参照スロー・ディレクトリのパスをダウンロードし、位置は厳しい要件ではありません。
次に、/ srcに/メイン/ JNIの.hヘッダファイルを取得するためのディレクトリには、日常の行に書き込みを輝くこのファイルを含む新しいCPPファイル、完全なコードを作成するには、次のとおりです。
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_example_androidtest_MainActivity */ #ifndef _Included_com_example_androidtest_MainActivity #define _Included_com_example_androidtest_MainActivity #ifdef __cplusplus extern "C" { #endif #undef com_example_androidtest_MainActivity_BIND_ABOVE_CLIENT #define com_example_androidtest_MainActivity_BIND_ABOVE_CLIENT 8L #undef com_example_androidtest_MainActivity_BIND_ADJUST_WITH_ACTIVITY #define com_example_androidtest_MainActivity_BIND_ADJUST_WITH_ACTIVITY 128L #undef com_example_androidtest_MainActivity_BIND_ALLOW_OOM_MANAGEMENT #define com_example_androidtest_MainActivity_BIND_ALLOW_OOM_MANAGEMENT 16L #undef com_example_androidtest_MainActivity_BIND_AUTO_CREATE #define com_example_androidtest_MainActivity_BIND_AUTO_CREATE 1L #undef com_example_androidtest_MainActivity_BIND_DEBUG_UNBIND #define com_example_androidtest_MainActivity_BIND_DEBUG_UNBIND 2L #undef com_example_androidtest_MainActivity_BIND_EXTERNAL_SERVICE #define com_example_androidtest_MainActivity_BIND_EXTERNAL_SERVICE -2147483648L #undef com_example_androidtest_MainActivity_BIND_IMPORTANT #define com_example_androidtest_MainActivity_BIND_IMPORTANT 64L #undef com_example_androidtest_MainActivity_BIND_NOT_FOREGROUND #define com_example_androidtest_MainActivity_BIND_NOT_FOREGROUND 4L #undef com_example_androidtest_MainActivity_BIND_WAIVE_PRIORITY #define com_example_androidtest_MainActivity_BIND_WAIVE_PRIORITY 32L #undef com_example_androidtest_MainActivity_CONTEXT_IGNORE_SECURITY #define com_example_androidtest_MainActivity_CONTEXT_IGNORE_SECURITY 2L #undef com_example_androidtest_MainActivity_CONTEXT_INCLUDE_CODE #define com_example_androidtest_MainActivity_CONTEXT_INCLUDE_CODE 1L #undef com_example_androidtest_MainActivity_CONTEXT_RESTRICTED #define com_example_androidtest_MainActivity_CONTEXT_RESTRICTED 4L #undef com_example_androidtest_MainActivity_MODE_APPEND #define com_example_androidtest_MainActivity_MODE_APPEND 32768L #undef com_example_androidtest_MainActivity_MODE_ENABLE_WRITE_AHEAD_LOGGING #define com_example_androidtest_MainActivity_MODE_ENABLE_WRITE_AHEAD_LOGGING 8L #undef com_example_androidtest_MainActivity_MODE_MULTI_PROCESS #define com_example_androidtest_MainActivity_MODE_MULTI_PROCESS 4L #undef com_example_androidtest_MainActivity_MODE_NO_LOCALIZED_COLLATORS #define com_example_androidtest_MainActivity_MODE_NO_LOCALIZED_COLLATORS 16L #undef com_example_androidtest_MainActivity_MODE_PRIVATE #define com_example_androidtest_MainActivity_MODE_PRIVATE 0L #undef com_example_androidtest_MainActivity_MODE_WORLD_READABLE #define com_example_androidtest_MainActivity_MODE_WORLD_READABLE 1L #undef com_example_androidtest_MainActivity_MODE_WORLD_WRITEABLE #define com_example_androidtest_MainActivity_MODE_WORLD_WRITEABLE 2L #undef com_example_androidtest_MainActivity_RECEIVER_VISIBLE_TO_INSTANT_APPS #define com_example_androidtest_MainActivity_RECEIVER_VISIBLE_TO_INSTANT_APPS 1L #undef com_example_androidtest_MainActivity_DEFAULT_KEYS_DIALER #define com_example_androidtest_MainActivity_DEFAULT_KEYS_DIALER 1L #undef com_example_androidtest_MainActivity_DEFAULT_KEYS_DISABLE #define com_example_androidtest_MainActivity_DEFAULT_KEYS_DISABLE 0L #undef com_example_androidtest_MainActivity_DEFAULT_KEYS_SEARCH_GLOBAL #define com_example_androidtest_MainActivity_DEFAULT_KEYS_SEARCH_GLOBAL 4L #undef com_example_androidtest_MainActivity_DEFAULT_KEYS_SEARCH_LOCAL #define com_example_androidtest_MainActivity_DEFAULT_KEYS_SEARCH_LOCAL 3L #undef com_example_androidtest_MainActivity_DEFAULT_KEYS_SHORTCUT #define com_example_androidtest_MainActivity_DEFAULT_KEYS_SHORTCUT 2L #undef com_example_androidtest_MainActivity_RESULT_CANCELED #define com_example_androidtest_MainActivity_RESULT_CANCELED 0L #undef com_example_androidtest_MainActivity_RESULT_FIRST_USER #define com_example_androidtest_MainActivity_RESULT_FIRST_USER 1L #undef com_example_androidtest_MainActivity_RESULT_OK #define com_example_androidtest_MainActivity_RESULT_OK -1L #undef com_example_androidtest_MainActivity_HONEYCOMB #define com_example_androidtest_MainActivity_HONEYCOMB 11L #undef com_example_androidtest_MainActivity_MSG_REALLY_STOPPED #define com_example_androidtest_MainActivity_MSG_REALLY_STOPPED 1L #undef com_example_androidtest_MainActivity_MSG_RESUME_PENDING #define com_example_androidtest_MainActivity_MSG_RESUME_PENDING 2L /* * Class: com_example_androidtest_MainActivity * Method: hello * Signature: (ILjava/lang/String;)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_example_androidtest_MainActivity_hello (JNIEnv *, jobject, jint, jstring); #ifdef __cplusplus } #endif #endif
0x03 JNI动态注册写法
本质是向RegisterNatives
0x04 编译SO文件
0x05 集成SO文件
0x06 测试结果
NDK官方指定使用Makefile来进行SO文件编译,那么新建一个文件重命名Android.mk。
目前最重要的是编译出一个SO成品来,一切配置最简单化。后续有详细需要各个编译选项的可以参考官方文档:https://developer.android.com/ndk/guides/android_mk.html?hl=zh-cn。
参考源