[英]Casting jlong to and from unsigned long int
我具有以下JNI函數:
JNIEXPORT jint JNICALL foo(JNIEnv *env, jobject obj, jlong id, jlongArray array)
{
jboolean isCopy;
jsize len = (*env)->GetArrayLength(env, array);
jlong* lp = (*env)->GetLongArrayElements(env, array, &isCopy);
if (!lp) {
return INSUFFICIENT_RESOURCES;
}
jlong retval = 0;
// insert code to cast id from jlong to ULONG before passing to bar(...)?
jint ret = bar(id, &retval);
if(len>=1) {
// insert code to cast retval from ULONG back to jlong
lp[0] = retval;
}
int mode = 0;
// if error code is returned then do not save changes
if(ret != 0) {
mode = JNI_ABORT;
}
(*env)->ReleaseLongArrayElements(env, array, lp, mode);
return ret;
}
方法bar
有簽名
int bar(ULONG id, ULONG *val);
ULONG
在哪里
typedef ULONG unsigned long int;
所以在我的JNI功能,我想投參數id
從jlong
到ULONG
,然后retval
從ULONG
回jlong
。 我可以直接進行轉換,還是在這兩種情況下可以執行一系列按位操作?
我知道此解決方案是一種技巧,但也許您可以通過String
。
java.util.Long
提供了從long
創建無符號String值的方法:
https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html#toUnsignedString-long-
這意味着,您始終可以將您的long值(假設您確保它不是負數並且在unsigned long
的范圍內)轉換為String
,將其傳遞給基於JNI
的代碼,然后將其轉換回。
爪哇
public static void main(String[] args) {
long value_min = 0;
// I assume that we are dealing with 32bit unsigned long on a C side
// if you try to test boundary case with 4294967296L it fill fail for
// 64bit macOS/Linux as you will be able to fit the value into variable.
long value_max = 4294967295L;
System.out.println("I am passing: " + value_min);
PassLongAsString.passULong(java.lang.Long.toUnsignedString(value_min));
System.out.println("I am passing: " + value_max);
PassLongAsString.passULong(java.lang.Long.toUnsignedString(value_max));
}
C
JNIEXPORT void JNICALL Java_recipeNo058_PassLongAsString_passULong
(JNIEnv * env, jclass obj, jstring str) {
//we have to get string bytes into C string
const char *c_str;
c_str = (*env)->GetStringUTFChars (env, str, NULL);
if (c_str == NULL) {
return;
}
printf ("Passed string: %s\n", c_str);
unsigned long ul = strtoul (c_str, NULL, 0);
printf ("Parsed value: %lu\n", ul);
//after using it, remember to release the memory
(*env)->ReleaseStringUTFChars (env, str, c_str);
}
當然,如果您傳遞價值,它將失敗
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.