天天看點

AndroidStudio+Cmake+NDK引用.so檔案超簡單

過程來自于官方文檔後的整理,有不明之處請直接閱讀官方文檔,下面是連結

最好的文檔其實就是官方文檔!

官方相關文檔

上一章我們講了怎麼把一個普通的Android項目變成一個支援NDK開發的項目

這一章我們來講講怎麼用我們已經寫好的NDK庫,也就是編譯後産生的.so檔案裡面的方法

1.打開我們上一章做的項目

app->build->intermediates->cmake->debug->obj

在obj檔案夾下面我們可以看到四個我們編譯後産生的.so檔案,

也就是我們寫的cpp檔案編譯後的二進制檔案

拿到這個.so檔案就可以調用我們之前寫在test.cpp裡面的方法(調用so檔案裡面方法的前提是我們知道裡面的方法名)

我們把這個四個檔案夾的内容複制出來,當然也有可能不是四個,主要看你配置的時候對應了哪些系統架構,不過不用太在意,幾個都行.記得連外面的帶架構名字的檔案夾一起複制

AndroidStudio+Cmake+NDK引用.so檔案超簡單

打開一個支援NDK的已經配置好Cmake的項目

我們可以用引導建立一個NDK的項目,或者直接把老項目按照第一章的做法弄成一個支援NDK的項目都行,因為需要用到

CMakeLists.txt配置檔案;

我這裡選擇在第一章的時候根據引導直接建立的支援NDK開發的項目,下面是目錄結構

AndroidStudio+Cmake+NDK引用.so檔案超簡單

然後我們需要建立一個jniLibs檔案夾

把剛才複制出來的四個.so檔案複制到該目錄下面

AndroidStudio+Cmake+NDK引用.so檔案超簡單

我們有了.so庫,那麼我們需要通過CMakeLists.txt檔案去把這些.so檔案與項目聯系起來

在引導建立過程中,我們有個native-lib庫已經預先建構了,是以需要使用 IMPORTED 标志告知 CMake 我們要把我們複制過來的.so庫導入到項目中

add_library( name
             SHARED
             IMPORTED )
           

添加我們的name庫

我們在上一章節中把庫的名字命名為”name”

是以第一個我們把自己的庫的名字填寫上去

第二個是設定庫為SHARED,

第三個設定為IMPORTED.這裡是因為是導入的庫

set_target_properties( # Specifies the target library.
                       name

                       # Specifies the parameter you want to define.
                       PROPERTIES IMPORTED_LOCATION

                       # Provides the path to the library you want to import.
                       name/src/main/jniLibs/${ANDROID_ABI}/libname.so )
           

同樣需要設定一些庫的屬性,

目标當然是我們的name庫啦.

name

是一個導入的庫,

PROPERTIES IMPORTED_LOCATION

庫的路徑是

name/src/main/jniLibs/${ANDROID_ABI}/libname.so

庫的路徑格式:

庫名

+

從src開始的到jniLibs為止的路徑

+

ANDROID_ABI 路徑變量

+

.so檔案名

到此為止我們CMakeLists.txt就配置好了

接下來就是看看我們的配置有沒有效果的時候了

因為我們在上一張直接複制了代碼到我們的cpp檔案當中,.so庫中的函數名和目前項目cpp檔案的函數名一毛一樣,

是以我們要先該改改函數名,不然函數名就沖突了.

我們沒有辦法更改.so檔案裡面的函數名,自然隻能更改目前項目的函數名;

shift+F6,然後更改函數字為”stringFromJNIFirst”,

注意:不要直接修改函數名,一定要用shift+F6,這樣才能同時替換掉cpp中的函數名

然後用一句

System.loadLibrary("name");

引用我們的.so庫

再用一句

public native String stringFromJNI();

對庫中的native函數作聲明

然後調用native函數,并将資料列印出來,下面是完整代碼

public class MainActivity extends AppCompatActivity {

    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
        System.loadLibrary("name");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Example of a call to a native method
        TextView tv = (TextView) findViewById(R.id.sample_text);
        tv.setText(stringFromJNIFirst());
        Log.e("CHEN",stringFromJNI());
    }

    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */

    public native String stringFromJNIFirst();
    public native String stringFromJNI();
}
           

輸出結果

06-21 16:51:07.845 11863-11863/com.zhenqi.myapplication E/CHEN: Hello from C++

ok.調用完成

上一章 Android studio Ndk Cmake配置,NDK開發簡單配置,超詳細帶圖

下一章節講講我們怎麼調用自己寫的新的.cpp