使用Google的串口jni調用demo serialport編譯動態庫的問題總結

    在項目當中要使用到串口和下位機通信,那麼直接在應用層使用jni方式進行串口調用並傳輸數據顯然是最方便的了,(關於串口默認權限的修改問題,我在這篇文章當中有說明:http://blog.csdn.net/zhaoqi2617/article/details/76582341)。在之前的項目當中也使用過,不過早就忘記了,而且沒有記錄下ndk配置和build要注意的點。這裏整理一下整個主線和遇到的問題:

    一:安裝配置NDK (這個在Android的菜單欄Tools下面可進行下載,然後進行配置);

# android NDK configuration
export NDK=/home/~~/software/androidStudio/androidSdk/sdk/ndk-bundle
export PATH=$PATH:$NDK

    二:使用javah -jni命令生成對應c文件的.h頭文件,修改Google原生的Serialport.c代碼裏面的方法明(其實就是open和close函數),修改Serialport.h頭文件裏面的include部分以及c文件裏面要引用的open和close函數等。(具體可參考之前的文章:http://blog.csdn.net/zhaoqi2617/article/details/53161417

    三:Android.mk文件,也可以參考上面的鏈接,要主要不能漏掉了"LOCAL_LDLIBS    := -llog ”這句,要不然會報錯:

clang++: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [obj/local/arm64-v8a/libSerialPort.so] Error 1

    四:最後通過ndk-build指令生成libs文件夾下面你需要的.so動態庫文件。

另外,如果沒有在Android.mk文件當中配置“TARGET_PLATFORM := android-3”也會出現問題,這裏的Android-3,是根據網絡上面的mk文件直接添加的,對應的好像是1.5的系統,我的系統肯定不是1.5的,但是找不到這個對應關係,還是就這樣添加上去了沒出錯。第二點就是mk文件裏面,LOCAL_MODULE := serial_port

這裏的名稱爲serial_port,那麼你在java文件當中System.loadLibrary("serial_port");這依據的時候就要對應這個module的名稱,要不然也會出錯,總之就是找不到對應的.so文件進行使用,一般會報以下錯誤:

                                                                        java.lang.UnsatisfiedLinkError: Couldn't load SerialPort from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.xiaole.xiaolerobot-1.apk"],nativeLibraryDirectories=[/data/app-lib/~~-1, /vendor/lib, /system/lib]]]: findLibrary returned null
                                                                            at java.lang.Runtime.loadLibrary(Runtime.java:365)
                                                                            at java.lang.System.loadLibrary(System.java:526)
                                                                            ~~~~~
                                                                            at android.app.ActivityThread.main(ActivityThread.java:5292)
                                                                            at java.lang.reflect.Method.invokeNative(Native Method)
                                                                            at java.lang.reflect.Method.invoke(Method.java:515)
                                                                            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)
                                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
                                                                            at dalvik.system.NativeStart.main(Native Method)

    另一個異常:以上步驟當中,通過ndk-build編譯後就會生成對應的libs和obj文件夾,而libs裏面的動態庫文件就是我們需要的東西了,但是有的開發者編譯後生成的動態庫表面上看是沒有什麼問題的,但是使用的時候可能會出現IOException 的問題,根據Google官方demo裏面的log是”The serial port can not be opened for an unknown reason." 我也出現了這樣的問題,花了一下午才把問題排查到ndk-build時候可能是ndk版本有問題,我使用的ndk版本是15.1.~~~編譯出來的動態庫就會出現上述的打開串口異常,後來請朋友用他的電腦執行了ndk-build這一步生成的動態庫在我的電腦上面就能夠使用了,他的版本是12.1.~~。


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