アンドロイドStudioはSOファイルをコンパイルして統合します

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/DXCyber​​409/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の\ DXCyber​​409 \ \メイン\のJava SRC \ dxcyber409 \ JNI" -classpath「E:\ワークスペース\ NetBeansの\ DXCyber​​409 \ターゲット\クラス」-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

 

参考源

https://www.jianshu.com/p/faa3eebbd401

おすすめ

転載: www.cnblogs.com/DXCyber409/p/10992309.html