【发布时间】:2016-10-03 01:21:15
【问题描述】:
我试图构建一个本地方法,虽然它似乎运行良好,但我很难理解函数中的字段 [*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
访问对象的字段
获取字段ID
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");
【问题讨论】:
-
这种性质的 JNI 方法或字段签名是
javap -s命令为该方法或字段输出的内容。当有一种工具可以为您解决这些问题时,不要费心自己去弄清楚它们。
标签: java java-native-interface