高版本AS JNI 的 Demo

今天是在國泰實習的第二天,師傅給我安排了小任務-賬號本地加密以及自定義鍵盤,其中加密算法要用C/C++實現。

當然我第一反應就是先做個NDK的demo,好多博客都是低版本AS中使用NDK的案例,試了下沒一個成功的,可能是我AS版本太高的原因吧,編譯過程個種報錯,頭大!!!

大體歸結爲, CMAKE,文件路徑,庫加載不到 等問題;

在不懈的搜索下發現了一篇不錯的文章:

https://blog.csdn.net/l_scag/article/details/80297212

這個方法不需要去修改gradle.properties和build.gradle

但是需要下載插件CMAKE,當然了CMAKE的安裝也很方便,只需要Settings->Appearance&Behavior->System Settings->Android SDK中的SDK Tools中勾選Cmake 然後apply 等待安裝完成即可。

然後新建項目, 在新建項目的時候 勾選 support C++

進入項目後會發現工程中以後具有了一個 NDK 的Demo 

其中需要了解的有兩個:

CMakeList.txt文件和main下的CPP文件夾

在CPP文件夾下存放的是我們具體實現

其中函數名的命名的格式 應該是 Java_包名_類名_方法名

其他遵循JNI協議規範

CMAKE文件主要是和so有關的,包過編譯和連接

 

add_library( # Sets the name of the library.
             mynativelib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             src/main/cpp/native-lib.cpp
             src/main/cpp/mynativelib.cpp)

其中mynativelib 即爲要生成的so文件的名次 可以自己定義,在加載庫時也是使用此名字

 

target_link_libraries( # Specifies the target library.
                       mynativelib

                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )

這個是用來鏈接庫文件的,爲了打包而設計的?我猜的。。。

指定庫名,當然這個庫名得和上面的庫名相同。

 

在這之前需要在java中實現一個類 類裏包含一個native方法。 其實就是對一個方法的聲明。

先寫這麼多以後在補充

昨天師傅說他看了我的blog ,瞬間羞愧,blog寫的那麼爛!。。。算了就這麼爛下去吧

 

補充1: 

一般在寫c++時我們會在.h中聲明一些變量和方法等,然後在cpp中引入該頭文件,在上面的基礎上發現,變易出錯根本得不到.so文件;想了好久懷疑可能.h文件也需要手動添加到cmake文件中。

於是乎我把我自己創建的.h文件也添加在了cmake文件中如下:

 

add_library( # Sets the name of the library.
             mynativelib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             src/main/cpp/native-lib.cpp
             src/main/cpp/mynativelib.cpp
             src/main/cpp/mynativelib.h)

然後編譯了一下 哈哈哈通過了。。。這樣基本上就可以和c++保持一致的風格了,但是在百度的時候發現一個問題就是有 c++d的容器庫貌似用不了,我還沒測試!!!


 

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