[英]how to pass structure from c code to java using Jni
我必須通過一個結構
struct Info {
u_int8_t timestamp[8];
u_int32_t a;
u_int32_t b;
u_int32_t c;
ActiveInfo activeInfo[MAX_ACTIVE_SET];
};
struct ActiveInfo
{
u_int8_t is_reference;
u_int16_t p;
u_int32_t q;
u_int8_t r;
u_int8_t s;
};
typedef struct ActiveInfo ActiveInfo;
我想將此(Info)結構傳遞給我的Java代碼。我已經掃了一眼,但沒有獲得完成此操作的完整方法。
謝謝。
該結構必須在Java端定義為帶有成員的類。 事實上,JNI允許C訪問Java對象,但不允許Java訪問C對象(結構) 。 因此,如果您想通過JNI“傳遞”某些東西並讓它可以在兩端訪問,那么它必須是一個Java對象,然后在界面中被限定為jobject
。 從C端開始,您有兩個選擇:
GetFieldID()
和Get/Set<Type>Field
直接訪問成員,盡管數組更復雜(我看到了一些) Invoke<Retval>Method
調用它們 這取決於數據存儲的設計。 您可能只想要一面(C或Java)讀取而另一面寫入,這可以方便地反映在設計中。
編輯:
可以在@asgoth指出的站點上找到示例: www.steveolyo.com 。 有一章名為“將C結構從C傳遞到Java”,然后它靜靜地解釋了如何在Java類中反映所需的C結構並通過JNI將Java對象傳遞給C - 這正是我的回答所說的。
你需要一個JNIEXPORT:
JNIEXPORT jint JNICALL
Java_FillCStruct
(
JNIEnv *env,
jclass obj,
jobject info // EntryInformation object instantiation
)
{
testInfo entryInfo;
jclass clazz;
jfieldID fid;
jmethodID mid;
GetInfo(entryInfo); // fills in the entryInfo
clazz = (*env)->GetObjectClass(env, info);
if (0 == clazz)
{
printf("GetObjectClass returned 0\n");
return(-1);
}
fid = (*env)->GetFieldID(env,clazz,"index","I");
// This next line is where the power is hidden. Directly change
// even private fields within java objects. Nasty!
(*env)->SetIntField(env,info,fid,testInfo.index);
...
這是一個帶有一些示例的網站: http : //www.steveolyo.com/JNI/JNI.html
您已經知道映射只能以一種方式工作:您可以從C / C ++訪問Java類,但反之亦然。
但是也要記住,這種映射會涉及大量的開銷-使用的內存和CPU都非常重要。
因此,放棄完全透明度可能是不可能的。 例如,如果您只需要讀取activeInfo [n] .s,則可以編寫本機方法getais(int n)。 或者你可以在java中作為DirectByteBuffer接收整個結構,計算所需的偏移量,並直接操作該值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.