過程來自于官方文檔後的整理,有不明之處請直接閱讀官方文檔,下面是連結
最好的文檔其實就是官方文檔!
官方相關文檔
上一章我們講了怎麼把一個普通的Android項目變成一個支援NDK開發的項目
這一章我們來講講怎麼用我們已經寫好的NDK庫,也就是編譯後産生的.so檔案裡面的方法
1.打開我們上一章做的項目
app->build->intermediates->cmake->debug->obj
在obj檔案夾下面我們可以看到四個我們編譯後産生的.so檔案,
也就是我們寫的cpp檔案編譯後的二進制檔案
拿到這個.so檔案就可以調用我們之前寫在test.cpp裡面的方法(調用so檔案裡面方法的前提是我們知道裡面的方法名)
我們把這個四個檔案夾的内容複制出來,當然也有可能不是四個,主要看你配置的時候對應了哪些系統架構,不過不用太在意,幾個都行.記得連外面的帶架構名字的檔案夾一起複制
打開一個支援NDK的已經配置好Cmake的項目
我們可以用引導建立一個NDK的項目,或者直接把老項目按照第一章的做法弄成一個支援NDK的項目都行,因為需要用到
CMakeLists.txt配置檔案;
我這裡選擇在第一章的時候根據引導直接建立的支援NDK開發的項目,下面是目錄結構
然後我們需要建立一個jniLibs檔案夾
把剛才複制出來的四個.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