日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVA进阶day07JNI(java调用c)B部分

發布時間:2023/12/9 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA进阶day07JNI(java调用c)B部分 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本博文要做兩件事
1:怎樣將c文件編譯成lib*.so
2:java同c語言文件如何傳遞返回數據類型

現在開始搞起:

  • 1:怎樣將c文件編譯成lib*.so
    Linux下編譯共享庫時,必須加上-fPIC參數,否則在鏈接時會有錯誤提示。故而我們的編譯就變成了
gcc -fPIC -shared -o libnative.so native.c

但是呢有提示說找不到jni.h 的路徑,那么咱們給gcc編譯制定路徑唄

gcc -I/usr/lib/jvm/java-1.7.0-openjdk-amd64/include/ -fPIC -shared -o libnative.so native.c

呶完美。我們有了c語言的動態庫。我們運行java JNIDemo的時候仍舊報錯。no native in java.library.path這是因為我們沒有給制定庫的路徑。

export LD_LIBRARY_PATH=.

加上這一個就可以了。
OK解決掉第一個見過就會,看過就忘的知識點。下面開始真正惡心人的地方。

  • 2 java同c語言文件如何傳遞返回數據類型

從實用的角度,我準備在這部分投機取巧。我就記住傳遞字符串,傳遞數組,傳遞基本類型數據。這三類。然后用到了我就來這兒扒代碼。本著這個思想幸福的貼代碼吧!!

  • 傳遞基本類型數據(直接使用,直接返回)
  • jint c_hello(JNIEnv *env, jobject cls, jint m) {printf("Hello, world! val = %d\n", m);return 100; }static const JNINativeMethod methods[] = {{"hello", "(I)I", (void *)c_hello}, };

    貼關鍵部分。
    2. 傳遞為字符串

    jstring JNICALL c_hello(JNIEnv *env, jobject cls, jstring str) {//printf("this is c : %s\n", str);//return "return from C";const jbyte *cstr;cstr = (*env)->GetStringUTFChars(env, str, NULL);if (cstr == NULL) {return NULL; /* OutOfMemoryError already thrown */}printf("Get string from java :%s\n", cstr);(*env)->ReleaseStringUTFChars(env, str, cstr);return (*env)->NewStringUTF(env, "return from c"); }static const JNINativeMethod methods[] = {{"hello", "(Ljava/lang/String;)Ljava/lang/String;", (void *)c_hello}, };

    3.傳遞的數組類型

    jint c_hello(JNIEnv *env, jobject cls, jintArray arr) {jint *carr;jint i, sum = 0;carr = (*env)->GetIntArrayElements(env, arr, NULL);if (carr == NULL) {return 0; /* exception occurred */}for (i=0; i< (*env)->GetArrayLength(env, arr); i++) {sum += carr[i];}(*env)->ReleaseIntArrayElements(env, arr, carr, 0);return sum; }static const JNINativeMethod methods[] = {{"hello", "([I)I", (void *)c_hello}, };

    闊以了,萬事大吉。
    接下來的博客安排,先不去寫異常 還有 c調用java部分。我記不住,什么時候用到的時候我再補充這個系列。接下來進行反射和內部類的知識補充。

    總結

    以上是生活随笔為你收集整理的JAVA进阶day07JNI(java调用c)B部分的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。