Android NDK開發 JNI操做java構造方法,普通方法,靜態方法(七)

Android NDK開發 JNI操做java普通、靜態、構造方法java

 1.Jni實例化一個Java類的實例jobject

1.經過FindClas( ),獲取Java類的的jclass
2.經過GetMethodID( ),獲取java類的構造方法ID
3.經過NewObject( ),實例化java類並傳遞參數 android

2. 經過jobject訪問Java類的普通方法

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    

 

 

 

3. 經過jobject訪問Java類的靜態方法

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);
}
相關文章
相關標籤/搜索