关于GetFieldID的澄清

时间:2016-10-03 01:21:15

标签: java java-native-interface

我正在尝试构建一个本机方法,虽然它似乎运行良好,但我正在努力理解函数中的字段[* sig] -

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

https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/functions.html

例如,我有一个小的Java代码,它使用一个名为“i”的实例变量,所有这个本机方法(名为test)都将它乘以2。

现在我指的是Java Complete Reference book - 这里的代码就像 -

我的问题是 - 这是什么“我” -     fid =(* env) - > GetFieldId(env,cls,“i”,“I”);

当我阅读Oracle文档时,它说 - 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()代替。
  联系:
  JNIEnv接口函数表中的索引94   参数:
  env:JNI接口指针   clazz:一个Java类对象   name:以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");

2 个答案:

答案 0 :(得分:2)

&#34; I&#34;这是原始整数类型的签名。 Oracle提供了一个签名类型表: image sample

  • Z boolean
  • B字节
  • C char
  • S short
  • I int
  • J long
  • F float
  • D double

对于非基本类型,签名的格式为

  • L 完全合格的班级;

对于数组,[已添加。

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

答案 1 :(得分:1)

请参阅&#34;员工&#34; Core Java中的示例,v.2 ch。 12,霍斯特曼和康奈尔在http://www.horstmann.com/corejava.html &#34; id&#34;这是该字段的名称     私人双薪; 在Employee类中;它的签名(&#34; sig&#34;),或类型,&#34; D&#34; (双)也必须指定。在你的代码中,&#34;我&#34;是整数。 请参阅&#34;类型字段&#34;在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);
}