zoukankan      html  css  js  c++  java
  • Android NDK开发 JNI操作java构造方法,普通方法,静态方法(七)

    Android NDK开发 JNI操作java普通、静态、构造方法

     1.Jni实例化一个Java类的实例jobject

    1.通过FindClas( ),获取Java类的的jclass
    2.通过GetMethodID( ),获取java类的构造方法ID
    3.通过NewObject( ),实例化java类并传递参数

    2. 通过jobject访问Java类的普通方法

    1.获取类名
      如果传入的是jobject需要通过GetObjectClass(jobject)获取jclass

      如果没有jobject需要通过FindClass("javapackage") 来获类的jclass

    2.获取类的方法的jmethodID

    3. 通过返回值来调用不通过的方法来调用传入jobject,jmethodID还有参数。 这里注意参数都jint,jstirng,jlong.不要直接传int,long这种类型的

    例如 

          返回值是

             无返回值的CallVoidMethod

             基本类型的可以直接找到对应的 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);
    }
  • 相关阅读:
    day 24
    day23
    day 22
    java中空格的操作
    java 解析Word文档以及Excel表格数据带有图片(2003/2007)
    java中创建文件夹
    http请求问题
    js弹框显示全部内容
    java实现HTTP请求的三种方式
    solr与java整合使用
  • 原文地址:https://www.cnblogs.com/mingfeng002/p/6600731.html
Copyright © 2011-2022 走看看