JNI使用のポイント

3152 ワード

最近会社で新しいプロジェクトを开いて、バックエンドと相谈して、httpの暗号化アルゴリズムを交换するつもりです.この交换は大丈夫です.水がまだ深いことに気づきました.まず、自分が関与したことのないNDKに出会って、それからJNIです.ここでは上の内容についてまとめます.
まずNDK環境構成
その後Android studioがNDKをサポートしていることを知り、急いでeclipseから切ってきて、良いチュートリアルを見つけて、基本的に簡単にdemoを作ることができます.
はい、プロジェクトはすでに组み合わせて、以下はjniのプログラミングで、ちょうど人のプロジェクトを见始めて、まったく头がなくて、めちゃくちゃに形容して、しばらくの时间の研究を経て、jniがjavaを呼び出す方法は実はとても简単で、よく使ういくつかの初期化、声明、呼び出し会、javaコードを过去に転化することができて、以下はよく使ういくつかの方法です:
AndroidJNI.FindClass    
static function FindClass (name : string) : IntPtr
Description  
This function loads a locally-defined class.
              。
AndroidJNI.GetMethodID     ID
static function GetMethodID (clazz : IntPtr, name : string, sig : string) : IntPtr
Description  
Returns the method ID for an instance (nonstatic) method of a class or interface.
        (   )      ID。       clazz       ,    clazz   。            。
GetMethodID()            。
AndroidJNI.NewObject     
static function NewObject (clazz : IntPtr, methodID : IntPtr, args : jvalue[]) : IntPtr
Description  
Constructs a new Java object. The method ID indicates which constructor method to invoke. This ID must be obtained by calling GetMethodID() with as the method name and void (V) as the return type.
     Java   。   ID            。  ID        GetMethodID()   ,            <init>,         void (V)。
clazz            。
</pre><pre code_snippet_id="574605" snippet_file_name="blog_20150107_5_7301243" name="code" class="java">AndroidJNI.CallIntMethod       
static function CallObjectMethod (obj : IntPtr, methodID : IntPtr, args : jvalue[]) : IntPtr
Description  
Calls an instance (nonstatic) Java method defined by methodID, optionally passing an array of arguments (args) to the method.
     methodID      Java  ,       (args)        。
もっと詳しくは以下の記事Android JNI関数の紹介を参照してください
次に例を示します.
 jclass string_cls = env->FindClass("java/lang/String");
    jmethodID substring_mid = env->GetMethodID(string_cls, "substring", "(II)Ljava/lang/String;");
    return reinterpret_cast<jstring>(env->CallObjectMethod(sign,substring_mid,4, 17));

GetMethodIDメソッドのフォーマットに注意してください.
jmethodID GetMethodID(JNIEnv *env, jclass clazz, const char *name, const char *sig); 
JNIEnvというパラメータC++には不要です.clazzは前に得たjclassです.
nameはメソッド名,sigはメソッド署名である.
メソッド署名には特定のフォーマットがあります:(param-type)ret-type、カッコ内はメソッドの入力パラメータタイプを表し、後ろは戻りタイプです.
ここでparam-typeとret-typeはいずれも特定の記号から構成される.ではsigはどうやってニを手に入れることができますか?
$ javap -s class
例:
$ javap -s java.lang.String  
public java.lang.String toUpperCase();
    Signature: ()Ljava/lang/String;

  public java.lang.String trim();
    Signature: ()Ljava/lang/String;

  public java.lang.String toString();
    Signature: ()Ljava/lang/String;

すべての方法と署名が見えます.
追加:
android.util.Base 64などのjava以外のメソッドは、ディレクトリの下にjavac-c class.javaをコンパイルしてからjavap-s classを実行する必要があります.
MACはAndroid Studioを使用