Android-NDK/JNI

JNI基础—Native 层构建 Java 对象

2018-09-15  本文已影响2人  Peakmain

常量指针和指针常量

void main(){
    //常量变量:被常量修饰的变量,不能再次被赋值(Java)
    //常量指针:const在*之前,指针的地址是可以被再次赋值的(可以修改的),指针地址上面的值(变量)是不能被修改的,常量指针的常量是不能被修改的
    //指针常量:const在*之后,指针的地址是不可以被再次赋值的,指针地址上面的值是可以被修改的,指针常量的指针地址是不能被修改的
    //常量 不可被修改
    const int number = 100;
    int number1 = 100;
    int number2 = 200;
    //常量指针
    const int *n_p = &number2;
    //赋值
    n_p = &number1;
    printf("n_p=%p", n_p);
    //*n_p = 300;值是不可修改的    ,但是地址是可以修改的
    int *const n_p1 = &number2;
    //n_p1 = &number1;地址是不能被重新赋值的
    *n_p1 = 300;
    getchar();
}

Native 层构建 Java 对象

怎么在c层构建java对象,并返回对象给java?
java层代码,新建point类

public class Point {
    private int x;
    private int y;

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public Point(int x, int y) {

        this.x = x;
        this.y = y;
    }
}

新建NdkSimple1类

 static {
        //引入加载我们的动态库
        //System.loadLibrary():android中加载apk中的.so库
        //System.load()加载一个具体路径上的so库,去服务器下载再进行加载
        System.load("D:/visual studio 2013/Projects/jni/x64/Debug/jni.dll");
    }
    public static void main(String[] args) {
       // NdkSimple1 ndkSimple1 = new NdkSimple1();
        Point point=createPoint();
        System.out.println("point:x ="+point.getX()+",y="+point.getY());
    }

    private static native Point createPoint();

c代码实现

JNIEXPORT jobject JNICALL Java_com_example_demo_NdkSimple1_createPoint
(JNIEnv *env, jclass jclz){
    //jclz代表的是NdkSimple1,项目的类`
    //全类名  .换成/
    jclass point_clz = (*env)->FindClass(env, "com/example/demo/Point");
    //构建java层point的对象 构造函数的id,构造方法<init>
    jmethodID j_mid = (*env)->GetMethodID(env, point_clz, "<init>", "(II)V");
    jobject point=(*env)->NewObject(env, point_clz, j_mid,16,45);
    return point;
}

做个测试,修改Y的值,只需要修改c的代码即可

JNIEXPORT jobject JNICALL Java_com_example_demo_NdkSimple1_createPoint
(JNIEnv *env, jclass jclz){
    //jclz代表的是NdkSimple1,项目的类`
    //全类名  .换成/
    jclass point_clz = (*env)->FindClass(env, "com/example/demo/Point");
    //构建java层point的对象 构造函数的id,构造方法<init>
    jmethodID j_mid = (*env)->GetMethodID(env, point_clz, "<init>", "(II)V");
    jobject point=(*env)->NewObject(env, point_clz, j_mid,16,45);
    //给y重新赋值,调用set方法
    j_mid = (*env)->GetMethodID(env, point_clz, "setY", "(I)V");
    (*env)->CallVoidMethod(env, point, j_mid, 33);
    return point;
}
    jfieldID j_fid = (*env)->GetFieldID(env, point_clz, "x", "I");
    (*env)->SetIntField(env, point, j_fid, 55);
上一篇 下一篇

猜你喜欢

热点阅读