我试图建立一个本地方法,虽然它看起来运行良好,但我努力理解函数中的字段[* SIG] -澄清有关GetFieldID
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完全参考手册 - 代码就像 -
我的问题是 - 这是什么“I” - fid =(* env) - > GetFieldId(env,cls,“i”,“I”);
当我读到甲骨文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()代替。
LINKAGE:
JNIEnv接口函数表中的索引94。
参数:
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");
这种性质的JNI方法或字段签名是该方法或字段的'javap -s'命令输出的内容。当有一种工具可以帮助你时,不要试图自己弄清楚。 – EJP