JNI使用のポイント
3152 ワード
最近会社で新しいプロジェクトを开いて、バックエンドと相谈して、httpの暗号化アルゴリズムを交换するつもりです.この交换は大丈夫です.水がまだ深いことに気づきました.まず、自分が関与したことのないNDKに出会って、それからJNIです.ここでは上の内容についてまとめます.
まずNDK環境構成
その後Android studioがNDKをサポートしていることを知り、急いでeclipseから切ってきて、良いチュートリアルを見つけて、基本的に簡単にdemoを作ることができます.
はい、プロジェクトはすでに组み合わせて、以下はjniのプログラミングで、ちょうど人のプロジェクトを见始めて、まったく头がなくて、めちゃくちゃに形容して、しばらくの时间の研究を経て、jniがjavaを呼び出す方法は実はとても简単で、よく使ういくつかの初期化、声明、呼び出し会、javaコードを过去に転化することができて、以下はよく使ういくつかの方法です:
次に例を示します.
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
すべての方法と署名が見えます.
追加:
android.util.Base 64などのjava以外のメソッドは、ディレクトリの下にjavac-c class.javaをコンパイルしてからjavap-s classを実行する必要があります.
MACはAndroid Studioを使用
まず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を使用