Androidベースのローカルコードジェネレータの詳細

4681 ワード

AndroidNDKを使用して開発したとき、ローカルコードフォルダを作成したり、ローカルコードファイルを生成したり、ローカルコードのコンパイルファイルを作成したりするのが煩わしいことがありました.特にローカルメソッドを実現するときも、ローカルメソッドの名前が長すぎるので煩わしいです.そのネーミング仕様は、Java_です.package-name_class-name_method-name(arguments)は、うっかりするとスペルミスが発生し、長時間のデバッグを招きます.このような苦しみに耐えず、同じことを繰り返さないために(DRY-Don't Repeat Yourself)、Javaプログラムを書いてこのことをしました.
このガジェットはJavaファイルを1つずつチェックし、ローカルメソッドファイル、すなわちローカルコードファイルを含むAndroidを生成することができます.mkファイルをコンパイルしてJavaファイルを更新し、Systemを追加する.loadLibrary.
具体的な原則は、•ローカルコードを含むJavaファイルごとに、そのファイル内のすべてのローカルメソッドを含むローカルファイルを生成することです.
•生成されるローカルメソッドは、標準に準拠したJNIです.具体的な形式は、次のとおりです.
 
  
return-type Java_package-name_class-name_method-name(arguments){
       }

つまり、必要なのはこの方法を実現することだけです.
•デフォルトのローカルコード共有ライブラリの名前はAndroidプロジェクトの名前です
この小さなツールがあれば、Javaでローカルメソッドを宣言し、このツールを実行してローカルメソッドを実現し、コンパイルすればいいのです.
<
このツールをダウンロードしてください.解凍後、Javaソース、Jarパッケージ(genjni.jar)、genjni.Shellスクリプト(genjni.sh)の3つのファイルがあります.ソースコードを入れた理由は、興味のある方は改善してもらえますが、改善後は
私に1部送ってください.ダウンロード後、Shellスクリプトを修正して、Jarファイルのパスを具体的な保存パスに変更したほうがいいです.そうしないと、Jarファイルが見つからないというエラーが表示されます.最後にgenjniをshは~/binの下に置いて、使いやすいようにします.使用する場合はAndroidプロジェクトのルートディレクトリの下でgenjniを実行します.shでいいです.
このユーティリティの使用方法を例として示します.HelloJniというプロジェクトを作成し、ローカルメソッドgetStringFromJni()を宣言するHelloJniActivityを作成します.getStringFromJni()が返す情報を表示するためにTextViewが使用されます.もう1つのローカルメソッドgetStatusFromJni(int)は表示用であり、使用されていない.これはJavaコードです.
 
  
package com.hilton.hellojni;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class HelloJniActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView text = (TextView) findViewById(R.id.text);
        text.setText(getStringFromJni());
    }

    private native String getStringFromJni();
    private native int getStatusFromJni(int type);
}

Javaコードを作成したら、端末からプロジェクトのルートディレクトリの下に入ります.
 
  
$cd HelloJni
$ls
AndroidManifest.xml  assets  bin  default.properties  gen  proguard.cfg  res  src
$genjni.sh
appplication HelloJni
package name: com.hilton.hellojni
class name: HelloJniActivity
$ls
AndroidManifest.xml  assets  bin  default.properties  gen  jni  proguard.cfg  res  src
$ls jni
Android.mk  HelloJniActivity.c

Androidを開くmkとHelloJniActivity.c
 
  
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := HelloJni
LOCAL_SRC_FILES := HelloJniActivity.c
include $(BUILD_SHARED_LIBRARY)
 
  
#include
jstring Java_com_hilton_hellojni_HelloJniActivity_getStringFromJni(JNIEnv* env, jobject thiz) {
}
jint Java_com_hilton_hellojni_HelloJniActivity_getStatusFromJni(JNIEnv* env, jobject thiz, jint type) {
}

もう一度確認してJAvaも更新され、共有ライブラリをロードする文が増えました.
 
  
package com.hilton.hellojni;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class HelloJniActivity extends Activity {
    static {
        System.loadLibrary("HelloJni");
    }
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView text = (TextView) findViewById(R.id.text);
        text.setText(getStringFromJni());
    }

    private native String getStringFromJni();
    private native int getStatusFromJni(int type);
}

残りの仕事はローカルメソッドを実現することです.もちろん、このツールには多くの問題があります.皆さんのフィードバックを歓迎したり、改善意見を出したりします.
また、このツールはJavaで書かれており、PerlやPythonのようなスクリプトで書くべきです.また、このツールをADTに統合したり、NDK開発に完全に使用される統合ツールANDTを作成したりすれば、R.javaを生成するようにローカルファイルを自動的に生成することができます.たとえば、ANDTツールを作成してEclipseに統合すると、Javaにローカルメソッドが宣言されたときに自動的にローカルファイルとコンパイルファイルを生成できます.これはどんなに素晴らしいことだろう.NDKの開発に大きな助けになるだろう.Googleは、NDKの開発に特化したEclipseプラグインを作るか、ADTにNDKのサポートを加えるべきだと思います.NDKのオープンインタフェースが増え、NDKの開発者も増え、NDKベースの開発アプリケーションも増えていくからです(2.3以降のバージョンでは、完全にNDKだけでApkを開発することができます.つまり、純C/C++でアプリケーションを開発することができます).この日が早く来てほしい.