Android NDK開發 JNI操做java普通、靜態、構造方法java
1.經過FindClas( ),獲取Java類的的jclass
2.經過GetMethodID( ),獲取java類的構造方法ID
3.經過NewObject( ),實例化java類並傳遞參數 android
1.獲取類名
若是傳入的是jobject須要經過GetObjectClass(jobject)獲取jclassapp
若是沒有jobject須要經過FindClass("javapackage") 來獲類的jclasside
2.獲取類的方法的jmethodIDthis
3. 經過返回值來調用不經過的方法來調用傳入jobject,jmethodID還有參數。 這裏注意參數都jint,jstirng,jlong.不要直接傳int,long這種類型的spa
例如 code
返回值是對象
無返回值的CallVoidMethodblog
基本類型的能夠直接找到對應的 int 對應CallIntMethod( );boolean對應CallBooleanMethod ( )...開發
引用類型的方法返回類型是CallObjectMethod。例如String類型調用CallObjectMethod,而後強制轉換爲jstring
Java層返回值 方法族 本地返回類型NativeType
返回值爲void : CallVoidMethod( ) A / V (無)
返回值爲引用類型: CallObjectMethod( ) jobect
返回值爲boolean : CallBooleanMethod ( ) jboolean
返回值爲byte : CallByteMethod( ) jbyte
返回值爲char : CallCharMethod( ) jchar
返回值爲short CallShortMethod( ) jshort
返回值爲int : CallIntMethod( ) jint
返回值爲long: CallLongMethod() jlong
返回值爲float : CallFloatMethod() jfloat
返回值爲double: CallDoubleMethod() jdouble
1.獲取類名
若是傳入的是jobject須要經過GetObjectClass(jobject)獲取jclass
若是沒有jobject須要經過FindClass("javapackage") 來獲類的jclass
2.獲取類的靜態方法的GetStaticMethodID
3.和上面普通同樣只是範圍時候。都要調用靜態的。
例如String 類型的CallStaticObjectMethod
activity
package com.tmf.ndk.type; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.widget.TextView; public class MainActivity extends AppCompatActivity { public final static String TAG = "MainActivity"; // Used to load the 'native-lib' library on application startup. static { System.loadLibrary("native-lib"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Student jniNewobj=accessConstructMethod(); Log.i(TAG, "jni new student=" + jniNewobj.toString()); Student student=new Student() ; String nameAge=getNameAge(student); Log.i(TAG, "Jni 初始的=" + nameAge); String nameAge1=setNameAge(student); Log.i(TAG, "Jni 處理的=" + nameAge1); Log.i(TAG, "student=" + student.toString()); TextView tv = (TextView) findViewById(R.id.sample_text); tv.setText(getStaticInfo()); } //構造方法 public native Student accessConstructMethod(); //JNI 調用對象 public native String getNameAge(Student student); //JNI 給對象複製 public native String setNameAge(Student student); //調用靜態方法 public native String getStaticInfo(); }
student
package com.tmf.ndk.type; import android.util.Log; public class Student { public final static String TAG = "Student"; String name; int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public int getAge() { Log.i(TAG, "getAge=" + age); return age; } public void setAge(int age) { this.age = age; Log.i(TAG, "setAge=" + age); } public String getName() { Log.i(TAG, "getName=" + name); return name; } public void setName(String name1) { this.name = name1; Log.i(TAG, "setName=" + name); } @Override public String toString() { String str = "name=" + name + " age=" + age; return str; } public static String getInfo(String name, int age) { String str = "靜態方法 name=" + name + " age=" + age; Log.i(TAG, "getInfo=" + str); return str; } }
jni
#include <jni.h> extern "C"{ JNIEXPORT jobject JNICALL Java_com_tmf_ndk_type_MainActivity_accessConstructMethod(JNIEnv *env, jobject instance); JNIEXPORT jstring JNICALL Java_com_tmf_ndk_type_MainActivity_getNameAge(JNIEnv *env, jobject instance, jobject student); JNIEXPORT jstring JNICALL Java_com_tmf_ndk_type_MainActivity_setNameAge(JNIEnv *env, jclass type, jobject student); JNIEXPORT jstring JNICALL Java_com_tmf_ndk_type_MainActivity_getStaticInfo(JNIEnv *env, jobject instance); } JNIEXPORT jobject JNICALL Java_com_tmf_ndk_type_MainActivity_accessConstructMethod(JNIEnv *env, jobject instance) { //獲取Student的jclass jclass studentClass=env->FindClass("com/tmf/ndk/type/Student"); //獲取Student的構造方法ID jmethodID studentCont=env->GetMethodID(studentClass,"<init>","(Ljava/lang/String;I)V"); //實例化Student並傳遞參數 jstring name = env->NewStringUTF("JIN 構造方法新建對象 寶強"); jint age=30; jobject student= env->NewObject(studentClass,studentCont,name,age); return student; } JNIEXPORT jstring JNICALL Java_com_tmf_ndk_type_MainActivity_getNameAge(JNIEnv *env, jobject instance, jobject student) { // jclass studentClass=env->FindClass("com/tmf/ndk/type/Student"); //經過實例類獲取類名com.tmf.ndk.type.Student jclass studentClass=env->GetObjectClass(student); //獲取類的getName方法名 jmethodID getName=env->GetMethodID(studentClass,"getName","()Ljava/lang/String;"); //經過實例類調用getName方法名 jstring name=(jstring)env->CallObjectMethod(student,getName); //getAge jmethodID getAge=env->GetMethodID(studentClass,"getAge","()I"); //經過實例類調用getAge方法名 jint age=env->CallIntMethod(student,getAge); //toString jmethodID toString=env->GetMethodID(studentClass,"toString","()Ljava/lang/String;"); //經過實例類調用toString方法名 jstring toStr=(jstring)env->CallObjectMethod(student,toString); const char *newStr = env->GetStringUTFChars(toStr, 0); return env->NewStringUTF(newStr); } JNIEXPORT jstring JNICALL Java_com_tmf_ndk_type_MainActivity_setNameAge(JNIEnv *env, jclass type, jobject student) { //經過實例類獲取類名com.tmf.ndk.type.Student jclass studentClass=env->GetObjectClass(student); jmethodID setName=env->GetMethodID(studentClass,"setName","(Ljava/lang/String;)V"); jstring name = env->NewStringUTF("李四"); env->CallVoidMethod(student,setName,name); //setAge jmethodID setAge=env->GetMethodID(studentClass,"setAge","(I)V"); jint age=100; //setAge env->CallVoidMethod(student,setAge,age); //toString jmethodID toString=env->GetMethodID(studentClass,"toString","()Ljava/lang/String;"); //經過實例類調用toString方法名 jstring toStr=(jstring)env->CallObjectMethod(student,toString); const char *newStr = env->GetStringUTFChars(toStr, 0); return env->NewStringUTF(newStr); } JNIEXPORT jstring JNICALL Java_com_tmf_ndk_type_MainActivity_getStaticInfo(JNIEnv *env, jobject instance) { jclass studentClass=env->FindClass("com/tmf/ndk/type/Student"); jmethodID geInfo=env->GetStaticMethodID(studentClass,"getInfo","(Ljava/lang/String;I)Ljava/lang/String;"); jstring name = env->NewStringUTF("靜態方法調用 老王"); jint age=20; jstring str=(jstring)env->CallStaticObjectMethod(studentClass,geInfo,name,age); const char *newStr = env->GetStringUTFChars(str, 0); return env->NewStringUTF(newStr); }