Android studio2.2+,配置NDK,JNI開發
一,Android studio2.2+以上版本
2.2以上版本預設是配置了NDK的。在你android SDK目錄下的ndk-bundle下。
在我們專案下的local.properties下已經配置好NDK路徑了,如下(我的路徑)
ndk.dir=C:\forwork\java\Android\sdk\ndk-bundle
sdk.dir=C:\forwork\java\Android\sdk
新建工程,如下圖,勾選紅框選項c++ suport
勾選了以後我們會發現新建的工程已經給我們配置好了NDK所需的環境,並且給我們建好了一個JNI的簡單例子。
因為我也勾選了kotlin support所以新建的專案是kotlin格式的。
我們會發現在新建的專案中已經有了,native方法,和一個library直接執行,呼叫的就是cpp裡面的方法返回的String 字串。
二,建立自己的library
public class NativeActivity extends AppCompatActivity {
static {
System.loadLibrary("native-activity");
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = findViewById(R.id.sample_text);
textView.setText(helloFromC());
}
public native String helloFromC();
}
我們新建一個Activity 並在裡面建立自己的native方法helloFormC()。這個時候會報錯,因為沒有這個方法,不用管,接下來生成我們自己的.h檔案。
開啟android studio 的Terminal控制檯,cd 到java目錄下 輸入命令:javah -d ../jni -jni com.xp.vedio.NativeActivity
“-d”後面是要生成檔案的目錄,jni後面是要生成的檔名字。回車以後 會在jni目錄下生成我們需要的.h檔案,發現之前的報錯沒有了。
然後根據.h檔案,寫我們需要的.cpp檔案,跟.h檔案對應,.cpp檔案才是真正的方法實體檔案。
#include <jni.h>
#include <string>
#include "com_xp_vedio_NativeActivity.h"
extern "C" JNIEXPORT jstring
JNICALL
Java_com_xp_vedio_NativeActivity_helloFromC(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++ as NativeActivity";
return env->NewStringUTF(hello.c_str());
}
.cpp檔案的方法名和.h檔案是對應的。後面發現不要.h檔案也是可以的。好處可能是方便些.cpp檔案方法把,畢竟.h是生成的。
最後一步:
在專案的CMakeLists.txt檔案,這個是新建專案的時候,自動給你生成的。我們需要在這個檔案下加入我們的.cpp檔案,讓他自己編譯。改檔案已經給了我們很友好的提示。
add_library( # Sets the name of the library.
native-activity
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
src/main/jni/native-activity.cpp )
第一行使我們的.cpp檔名字,第二行分享改檔案,第三行檔案路徑。
target_link_libraries( # Specifies the target library.
native-lib
native-activity
# Links the target library to the log library
# included in the NDK.
${log-lib} )
在target_link_libraries加入自己的.cpp檔案。然後執行,就可以了。
如果不加入的上面東西的話,會造成找不到對應的.so檔案,會報錯。
最後點選studio的Build–》Make project會生成apk檔案。點選雙擊apk檔案
對應的.so檔案已經生成,並且打包在apk檔案中。
執行,大功告成。
之前因為NDK編譯的各種麻煩,都懶得去弄,現在發現android 對於 NDK的支援越來越好了。