Android Studio3.0开发JNI流程------JNI为静态常量(public static)赋值操作

本文介绍了如何在Android Studio 3.0中使用JNI为Java类的静态常量进行赋值操作。通过示例展示了Test类和Test1类的结构,详细说明了按钮点击事件调用的native方法实现过程,并提供了转换后的JNI代码,最终展示了运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模拟两个类一个类中有静态的常量,另一个类是常量…
Java代码:
Test类

public class Test {
    static {
        System.loadLibrary("wechatcore");
    }
    public static double d1 = 0;
    public static double d2 = 0;

    //模拟一个函数进行JNI赋值操作...
    public static native void t(int n1, int n2);

    //这是Java代码...
    public static void test(int n1, int n2) {
        if (n1 == 1 && n2 == 2) {
            Test1 test1=new Test1();
            d1 = test1.lat;
            d2 = test1.lng;
            Log.e("test",d1+"----"+d2);
        }
    }
}

Test1类

public class Test1 {
    public double lat =10.2;
    public double lng =18.3;
}

在按钮点击事件调用Test中的native方法t

Test.t(1,2);

将Java代码转JNI代码:

/**
 * 模拟操作...
 */
extern "C"
JNIEXPORT void JNICALL
Java_com_tencent_mm_wvs_test_Test_t(JNIEnv *env, jclass type, jint n1, jint n2) {
    jdouble lat;
    jdouble lng;
    jdouble d1;
    jdouble d2;
    if (n1 == 1 && n2 == 2) {
        LOGE("-----进入if true开始-----");
        //获取test类...
        jclass Test1 = env->FindClass("com/tencent/mm/wvs/test/Test1");
        jmethodID test1_methodID = env->GetMethodID(Test1, "<init>", "()V");
        //创建对象
        jobject test = env->NewObject(Test1, test1_methodID);
        //找到Test1中的两个值lat   lng
        jfieldID lat_fieldID = getFieldID(env, Test1, "lat", "D");
        lat = env->GetDoubleField(test, lat_fieldID);

        jfieldID lng_fieldID = getFieldID(env, Test1, "lng", "D");
        lng = env->GetDoubleField(test, lng_fieldID);

        //打印这两个值
        LOGE("(Test1)  lat = %f", lat);
        LOGE("(Test1)  lng = %f", lng);

        //获取静态的d1,d2
        jfieldID d1_fieldID = getStaticFieldID(env, type, "d1", "D");
        d1 = env->GetStaticDoubleField(type, d1_fieldID);

        jfieldID d2_fieldID = getStaticFieldID(env, type, "d2", "D");
        d2 = env->GetStaticDoubleField(type, d2_fieldID);

        //输出d1,d2的值
        LOGE("(Test)初始值  d1 = %f", d1);
        LOGE("(Test)初始值  d2 = %f", d2);
        //赋值操作...
        env->SetStaticDoubleField(type, d1_fieldID, lat);
        env->SetStaticDoubleField(type, d2_fieldID, lng);

        //获取赋值以后的值...
        d1 = env->GetStaticDoubleField(type, d1_fieldID);
        d2 = env->GetStaticDoubleField(type, d2_fieldID);

        //打印赋值以后的值
        LOGE("(Test)赋值后  d1 = %f", d1);
        LOGE("(Test)赋值后  d2 = %f", d2);
        LOGE("-----进入if true结尾-----");
    }
}

运行结果:

12-25 11:57:57.099 21577-21577/com.tencent.mm.wvs E/捕获====: -----进入if true开始-----
12-25 11:57:57.099 21577-21577/com.tencent.mm.wvs E/捕获====: (Test1)  lat = 10.200000
12-25 11:57:57.099 21577-21577/com.tencent.mm.wvs E/捕获====: (Test1)  lng = 18.300000
12-25 11:57:57.099 21577-21577/com.tencent.mm.wvs E/捕获====: (Test)初始值  d1 = 0.000000
12-25 11:57:57.100 21577-21577/com.tencent.mm.wvs E/捕获====: (Test)初始值  d2 = 0.000000
12-25 11:57:57.100 21577-21577/com.tencent.mm.wvs E/捕获====: (Test)赋值后  d1 = 10.200000
12-25 11:57:57.100 21577-21577/com.tencent.mm.wvs E/捕获====: (Test)赋值后  d2 = 18.300000
12-25 11:57:57.100 21577-21577/com.tencent.mm.wvs E/捕获====: -----进入if true结尾-----
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值