jni引用so庫

複習java的時候複習到了jni,書上只是簡單列出來了五點步驟,實際上不自己動手的話不理解,剛好有項目需要通過java的jni調用c的sdk,因而自己動手嘗試了一下。

  1. 編寫java類,編譯成class和h文件

    編寫時需要聲明爲native方法,然後System.load()System.loadLibrary()加載so庫,後面調用方法即可。

    由於項目規模比較大,因而先用maven生成jar包,然後jar -xvf解jar包,由於jar包中的是class文件,直接在當前目錄下javah 類名得到頭文件。注意當內部類較多時,需要查看調用的方法在哪個頭文件中。

  2. 編寫c文件,引入生成的頭文件

    編寫一個同名c文件,要引入第一步生成的頭文件,然後實現java中聲明的方法,如果方法在其他so庫中或頭文件中,要將so文件或其他頭文件放到當前目錄下,並將當前目錄加入到path路徑下。

    其中比較關鍵的一步是當需要將頭文件中的jstring轉化爲char *時,需要調用該方法char *nativeString = (*env)->GetStringUTFChars(env, logstr, 0);,參考https://stackoverflow.com/questions/4181934/jni-converting-jstring-to-char

  3. 編譯c文件,文件名和路徑要符合一開始java文件加載路徑。

感覺上jni編譯出來的so文件並不能複用,或許有更加便捷的方法或工具。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章