java - 关于 GetFieldID 的说明

标签 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”的实例变量,所有这个 native 方法(名为 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

Accessing Fields of Objects
GetFieldID

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

Returns the field ID for an instance (nonstatic) field of a class. The field is specified by its name and signature. The GetField and SetField families of accessor functions use field IDs to retrieve object fields.
GetFieldID() causes an uninitialized class to be initialized.
GetFieldID() cannot be used to obtain the length field of an array. Use GetArrayLength() instead.
LINKAGE:
Index 94 in the JNIEnv interface function table.
PARAMETERS:
env: the JNI interface pointer.
clazz: a Java class object.
name: the field name in a 0-terminated modified UTF-8 string.
sig: the field signature in a 0-terminated modified UTF-8 string.

您能否详细说明这个字段“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");

最佳答案

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

  • Z boolean 值
  • B字节
  • C字符
  • 我知道
  • J长
  • F float
  • D双

对于非原始类型,签名的形式为

  • L 完全合格的类(class) ;

对于数组,添加了[。

对于方法,()用于分隔参数和返回值。

关于java - 关于 GetFieldID 的说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39823375/

相关文章:

java - 如果给出无效响应,请重新运行 main 方法?

java - 在静态初始化程序中使用 native 调用的 JNI RegisterNatives

java - 我可以附加到不同进程中的 JVM 吗?

java - 浏览器重启java后保持 session

java - TestNG try/catch 无法正常工作

openssl - AES_encrypt/AES_decrypt 只返回消息的一部分

java - 如何通过 JNI 将 C 字符串 Emoji 传递到 Java

android - 如何使用 Runtime.getRuntime().exec ("cmd")

java - ORMLite 初始化外部集合

java - 如何通过maven连接吗啡注释类?