Android NDKが開発した環境構築と簡単な例


一、NDKとJNIの紹介
NDKは全部native development kitといいます。現地語(C&C+)開発パッケージです。対応するのは、常に接触するAndroid-SDK、ソフト開発パッケージ(java言語開発のみ対応)です。
簡単にNDKを利用して、純粋なC&C++のコードを開発して、ライブラリにコンパイルして、Android d-SDKで開発したJavaプログラムで起動させます。NDKが開発したのは、下の層開発やjni層開発といってもいいです。SDK開発は上の層開発と言ってもいいです。
Androidの開発にNDKが使われた理由:
1、周知のように、SDKで作成したコードを利用して、発生したAPKは、簡単に逆コンパイルできます。安全性は極めて高くないです。NDKで開発したライブラリを利用すると、逆コンパイルされにくく、機密性も高くなります。
2、多くのオープンソースプロジェクトと大型プロジェクトはC&C++コードです。これらを純粋なjava言語に変換するのは明らかに不可能です。
3、C&C++のコードの運行速度と効率はjavaよりずっと速いです。
JNIは全部Java Native Interface(JAVAローカルコール)と呼びます。Java 1.1からJNIはjavaプラットフォームの一部となり、Javaコードと他の言語で書かれたコード(C&C+)との相互作用を可能にする。AndroidからJNIの概念を導入したのではない。
簡単に言えば、AndroidのNDKはいくつかのクロスコンパイルツールチェーンとAndroidのライブラリを提供しています。これらのAndroidのライブラリは、開発者が現地の言語を作成するプログラムの時に呼び出すことができます。NDKが提供するクロスコンパイルツールチェーンは既に作成されたC&C++コードをコンパイルしてライブラリを生成します。もちろんです。自分でクロスコンパイル環境を作ってもいいです。NDKの工具や倉庫を使わないでください。そしてライブラリを生成して、規範的な操作さえすれば、JAVA層を成功的に起動させるライブラリファイルを生成することができます。
二、NDK環境構築
最新のNDKを使って、cygwinを直接に捨てて、以前はAndroidのプロジェクトをしてNDKを使わなければならなくて、Cygwinをダウンロードしてインストールして、CDT(Eclipse C/C++開発プラグイン)をダウンロードして、コンパイラを配置しなければなりません。環境変数、特に面倒です。新版は必要ありません。
Android SDKをダウンロードしますhttp://developer.android.com/sdk/index.html
Android NDKをダウンロードしますhttp://developer.android.com/tools/sdk/ndk/index.html (注:NDKバージョンはr 7以上でCygwinとして集積されています。しかも非常にシンプルなバージョンです。)
本人が使っているSDKとNDKは

Eclipse設定
Eclipseを開けて、Window->Preferences->Android->NDKルートを設定して、例えば私のはF:android-ndk-r 10 eです。新しいAndroidプロジェクトのNDKTestを作成して、プロジェクトの上で右クリックしてAndroid Tools->Add Native Supportをクリックしてください。そして私たちのためのファイルに名前をつけてください。この時、プロジェクトはもう一つのjniのフォルダができます。jniの下にAndroid.mkとNDKTest.cppファイルがあります。Android.mkはNDKプロジェクトのMakefileで、NDKTest.cppはNDKのソースファイルです。

次にNDKTest.cppファイルを作成します。

<span style="font-size:14px;">#include <jni.h>
#include <string.h>
extern C
 
jstring Java_com_example_ndktest_MainActivity_NDKTestFromJNI(JNIEnv* env,
    jobject thiz) {
  return env->NewStringUTF(Hello from JNI !);
}
</string.h></jni.h></span>
引き続きMainActivity.javaファイルを作成します。

<span style="font-size:14px;">package com.example.ndktest;
 
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
 
public class MainActivity extends Activity {
 
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
 
    TextView tv = new TextView(this);
    tv.setText(NDKTestFromJNI());
    setContentView(tv);
  }
 
  public native String NDKTestFromJNI();// native  ,        Native 。       native    
 
  static {
    System.loadLibrary(NDKTest);//    ,   lib       
  }
}
</span>
コンパイルを実行して、先にcppファイルをコンパイルして、右クリックの工事プロジェクトのNDKTest、Build Project、成功の結果はlibsディレクトリの下で生成しました。soファイル


Android Javaプロジェクトをコンパイルして、右クリックしてプロジェクトrun apprationを行います。

三、関連問題
NDK構築と実例過程において、いくつかの問題は以下の通りである。
Eclipseエラー「アンレレスved inclusion jni.h」
NDKの開発をする過程で、eclipseでinclusionを処理できなくて、smbolにエラーが表示されることがあります。ネット上では「アンレスved inclusion jni.h」のようなエラーを解決する方法がたくさんあります。
最終的な解決方法は、初期化eclipseがこのプロジェクトに対するnative esuport:
1.eclipseで指定プロジェクトをクローズする
2.他の編集ツールでこのプロジェクトのプロジェクトファイルを開き、以下の内容を削除します。
……
org.eclipse.cdt.maagedbuilder.co.genmakebuilder
clean、full、increment al、
……
org.eclipse.cdt.manage dbuilder.co.Scanner ConfigBuider
full,increment al
……
org.eclipse.cdt.com.org.c.nature
org.eclipse.cnature.
org.eclipse.cdt.manage dbuilder.co.manage dBuild Nature
org.eclipse.cdt.manage dbuilder.co.Scanner ConfigNature
3.削除.cprojectファイル
4.eclipseで元のプロジェクトを開けて、refresh、そして右ボタン->properties->Android Tools->Add Native Support
5.解決
windowプラットフォームの下でEclipse Ndk開発中のMethod'NewStrigUTF'could not be resoved問題
プロジェクトの右ボタン->>属性->c/c+レギュラー->Code Analysisを選択して、Use project settingsの中の方法を選択して解析できません。選択をキャンセルして、アプリケーション->を確定して、更新、整理、更新、buildプロジェクトを更新します。
jni/hello cpp/main.cpp:16:18:error:base operand of'-''has non-pointer type'JNIEncv{aka_}JNIEnv
エラーは:
(*env)->NewStringUTF(env,Hello from JNI!)
この行はcの書き方です。私のはcppプログラムです。書き換える必要があります。
env->NewStrigUTF(Hello from JNI!)
java.lang.Unisatis fiedlinkError:Native method not found問題
1、c++の中の方法Java_xxxxxxの中のJavaイニシャルは必ず大文字にしてください。
2.cppファイルはextern Cを使って、大括弧の中であなたの地元の方法です。
 以上はAndroidに対してです。 NDK環境構築及びコード例、整理しました。引き続き関連資料を補充します。ありがとうございます。