Android Cmake 編譯c,c++原始檔,實現JNI呼叫
阿新 • • 發佈:2019-01-24
這幾天研究了一下安卓涉及到JNI相關的知識點,本以為很簡單的東西,結果實現起來各種錯誤,現在總結一下貼出來
希望有幫助
這篇文章,只介紹使用Cmake去編譯so檔案,NDK的先不討論,個人覺得ndk比較麻煩
1、首先需要下載Cmake,這個AS都自帶了功能,見下圖
Cmake是一個編譯工具,LLDB應該是一個NDK下的除錯工具,NDK不必說了,三個都更新一下
如果使用NDK的話,需要配置NDK的環境變數
2、新建一個專案,注意哦,不要勾選Include C++ Support
最好不要勾選,我們需要一步一步來
3、在專案的main目錄下新建cpp資料夾,並且建立你需要的.cpp .h檔案
JniTest.h JniTest.cpp native-lib.cpp(CmakeLists.txt稍後再講)
這裡簡單貼一下三個檔案的原始碼,就是求(a+10)的值,native-lib.cpp是開放給java層呼叫的,再裡面負責呼叫JniTest裡面的內容
JniTest.h:
#ifndef JNITEST_CMAKE_MAX_H #define JNITEST_CMAKE_MAX_H int test(int a); #endif //JNITEST_CMAKE_MAX_H
JniTest.cpp:
int test(int a) { return 10 + a; }
native-lib.cpp:
#include <jni.h> #include "JniTest.h"(JNIEnv* env,jobject object)這兩個是必須要的,後面的jint a 是接受java層的引數extern "C" { jint Java_com_test_MainActivity_maxFromJNI( JNIEnv* env, jobject object, jint a) { return test(a); } }
下面看CmakeList.txt
# 指定cmake最低版本,如果不知道就複製吧 cmake_minimum_required(VERSION 3.4.1) # 第一個native-lib是供java呼叫的檔案, SHARED是啥沒看明白但是要寫上 # 最後倆是所有cpp的名字和相對本檔案的位置,這裡在一個資料夾中就直接寫名字了,檔案有多少寫多少 add_library(native-lib SHARED native-lib.cpp JniTest.cpp) # 我的理解是java要連線到native-lib,和一些其它的東西,不懂 target_link_libraries(native-lib)
照著這個寫就好了
4、最後配置一下 app gradle
5、現在在java層呼叫就好啦
public class MainActivity extends AppCompatActivity { static { System.loadLibrary("native-lib"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView textView = (TextView) findViewById(R.id.text); textView.setText(maxFromJNI(14) + ""); } public native int maxFromJNI(int a); }