关于GetFieldID的澄清

 2023-01-21    232  

问题描述

我试图构建一种本机方法,尽管它似乎运行良好,但是我正在努力理解函数中的字段[*sig] –

jfieldID GetFieldID(JNIEnv *env, jclass clazz,
    const char *name, const char *sig);

例如,我有一个小的Java代码,该代码使用一个称为” I”的实例变量,所有这些本机方法(命名test)都将其乘以2.

关于GetFieldID的澄清

现在我指的是Java完整参考书 – 这里的代码像 –

我的问题是 – 这是什么”我” –
fid =(*env) – > getfieldid(env,cls,” i”,” i”);

当我阅读Oracle Documenttion时,它说 –
https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/functions.html

访问对象的字段
getfieldid

jfieldID GetFieldID(JNIEnv *env, jclass clazz,
const char *name, const char *sig);

返回类的实例(非静态)字段的字段ID.该字段由其名称和签名指定. GetField和SETFIELD家族的登录机功能使用字段ID来检索对象字段.
getFieldId()导致一个非初始化的类被初始化.
GetFieldId()不能用于获得数组的长度字段.代替使用getarraylength().
链接:
索引94在JNIENV接口函数表中.
参数:
env:JNI接口指针.
clazz:java类对象.
名称:0端的修改UTF-8字符串中的字段名称.
SIG:0端的修改UTF-8字符串中的字段签名.

您能详细说明这个字段” SIG”是什么?我无法将”我”与任何事物联系起来.

#include <jni.h>
#include "NativeDemo.h"
#include <stdio.h>

JNIEXPORT void JNICALL Java_NativeDemo_test(JNIEnv *env , jobject obj)
{
    jclass cls;
    jfieldID fid;
    jint i;

    printf("Starting the native method\n");

    cls = (*env)->GetObjectClass(env,obj);
    fid = (*env)->GetFieldId(env,cls,"i", "I");

推荐答案

请参阅下面的”员工”示例,core java,v.2ch. 12,由Horstmann and Cornell撰写 http://www.horstmann.com/corejava.html
” id”是字段的名称,这里
私人双工资;
在员工课内;还必须指定其签名(” SIG”)或类型” D”(Double).在您的代码中,”我”是整数.
请参阅 http://http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.html
一旦获得JFieldID,它可以用于修改
字段.

/**
  @version 1.10 1999-11-13
  @author Cay Horstmann
*/

#include "Employee.h"
#include <stdio.h>

JNIEXPORT void JNICALL Java_Employee_raiseSalary(JNIEnv* env, jobject     this_obj, jdouble byPercent)
{  
   /* get the class */
   jclass class_Employee = (*env)->GetObjectClass(env, this_obj);

   /* get the field ID */
   jfieldID id_salary = (*env)->GetFieldID(env, class_Employee, "salary", "D");

   /* get the field value */
   jdouble salary = (*env)->GetDoubleField(env, this_obj, id_salary);

   salary *= 1 + byPercent / 100;

   /* set the field value */
   (*env)->SetDoubleField(env, this_obj, id_salary, salary);
}

其他推荐答案

” i”这是原始整数类型的签名. Oracle提供了一个类型签名表: htttp ://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.html#wp276

  • z boolean
  • b字节
  • c char
  • s短
  • i int
  • J Long
  • f float
  • d double

对于非主要类型,签名是形式

  • l 完全Qualified class ;

阵列,[添加.

对于方法,()用于将参数与返回值分开.

以上所述是小编给大家介绍的关于GetFieldID的澄清,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26225.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。