簡體   English   中英

將jlong​​與無符號long int進行轉換

[英]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功能,我想投參數idjlongULONG ,然后retvalULONGjlong 我可以直接進行轉換,還是在這兩種情況下可以執行一系列按位操作?

我知道此解決方案是一種技巧,但也許您可以通過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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM