美文网首页Android-NDK/JNI
JNI基础—Native 层构建 Java 对象

JNI基础—Native 层构建 Java 对象

作者: Peakmain | 来源:发表于2018-09-15 17:16 被阅读2次

常量指针和指针常量

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的代码即可

  • 通过set的方法修改y的值
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;
}
  • 直接通过属性赋值修改x的值
    jfieldID j_fid = (*env)->GetFieldID(env, point_clz, "x", "I");
    (*env)->SetIntField(env, point, j_fid, 55);

相关文章

  • JNI基础—Native 层构建 Java 对象

    常量指针和指针常量 Native 层构建 Java 对象 怎么在c层构建java对象,并返回对象给java?jav...

  • JNI 原理

    我们都知道JNI结构是 Java 层 -> JNI -> Native 层, 以此实现Java 层和Native层...

  • JNI 基础知识

    JNI 基础知识 什么是 JNI ? JNI (Java Native Interface) 是 Java 沟通 ...

  • Android JNI之加载第三方so库

    JNI全称是Java Native Interface,为Java本地接口,是连接Java层与Native层的桥梁...

  • NDK 复杂对象传递

    1 JAVA层传递复杂对象到JNI假设我们需要返回的对象如下,是一个Student: 下面是Native层接收...

  • 每次吃一点AndroidのNDK&JNI

    1. 初识NDK&JNI 1.1. 基础概念 JNI(Java Native Interface):java本地接...

  • jni

    jni函数的注册:java层的native函数是怎么和jni层函数关联的; 1.静态注册:java层的具有nati...

  • Tip | JNI数据类型与指针嵌套

    JNI数据类型 Java Type Java数据类型 Native Type Native层的数据类型 Descr...

  • JNI 入门

    基础知识 1 什么是JNI?JNI全称为:Java Native Interface。JNI 是本地编程接口,它使...

  • 如何引用C/C++代码进入Studio里

    什么是JNI(Java Native Interface)呢? Java Native Interface(JNI...

网友评论

    本文标题:JNI基础—Native 层构建 Java 对象

    本文链接:https://www.haomeiwen.com/subject/xpqtnftx.html