我試圖建立一個本地方法,雖然它看起來運行良好,但我努力理解函數中的字段[* 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