1. 程式人生 > >Android Cmake 編譯c,c++原始檔,實現JNI呼叫

Android Cmake 編譯c,c++原始檔,實現JNI呼叫

這幾天研究了一下安卓涉及到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"
extern "C" { jint Java_com_test_MainActivity_maxFromJNI( JNIEnv* env, jobject object, jint a) { return test(a); } }
(JNIEnv* env,jobject object)這兩個是必須要的,後面的jint a 是接受java層的引數

下面看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);
}