Android Studio JNI開發
1首先下載NDK.在Android中配置NDK.
如下圖所示:
也可以開啟local.properties檔案新增下面程式碼,
ndk.dir=D:\Android\android-ndk-r10
記得路徑自己修改一下.
2. 在mian資料夾下新建jni資料夾,開啟app d的build.gradle檔案,新增下面的程式碼
defaultConfig {
applicationId "edu.dushiguang.jnitest"
minSdkVersion 19
targetSdkVersion 23
versionCode 1
versionName "1.0"
ndk {
moduleName "jniTest"//so檔案的名稱
ldLibs "log", "z", "m"
abiFilters "armeabi", "armeabi-v7a", "x86"
}
}
sourceSets.main {
jniLibs.srcDir 'libs'
jni.srcDirs 'src/main/jni'
}
3. 開啟gradle.properties檔案新增下面程式碼
android.useDeprecatedNdk=true
開啟MainActivity.java檔案.程式碼如下:
public class MainActivity extends Activity {
private TextView tv;
public native String getStr ();
static {
System.loadLibrary("jniTest");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) this .findViewById(R.id.tv);
tv.setText(getStr ());
}
}
此時public native String getStr ();這句話會報紅暫時不用管.
Make Project一下可以在自己的工程目錄下看到有.class檔案生成,例如下面的我的工程目錄:
JNITest\app\build\intermediates\classes\debug\edu\dushiguang\jnitest
5. 帶開studio的Terminal或者自己的windows的控制檯也行
進入到自己的mainActivity檔案目錄下例如下面的目錄地址:
D:\AndroidStudioProjects\JNITest\app\src\main\
執行下面的命令,有些長,
javah -d jni -classpath
D:\Android\android-sdk-windows\platforms\android-22;java\ edu.dushiguang.jnitest.MainActivity
注意java\ edu中間有個空格.
解釋一下命令:
D:\Android\android-sdk-windows\platforms\android-22
這個是你sdk下的目錄可順著找一下.
java\ edu.dushiguang.jnitest.MainActivity
mainActivity目錄.
執行成功後會在main\jni目錄下產生一個.h檔案
如果你cd到了java目錄下執行
javah-d jni –classpath
D:\Android\android-sdk-windows\platforms\android-22; edu.dushiguang.jnitest.MainActivity
將會在main\java檔案加下生成一個jni資料夾.
另外網上有些朋友給出的命令是:
javah -d jni -classpath D:\Android\android-sdk-windows\platforms\android-22;….\build\intermediates\classes\debug edu.dushiguang.jnitest.MainActivity
也就是說執行的是building下的MainActivity.
這樣我試了一下會發現報下面的錯:
錯誤: 無法訪問android.support.v7.app.AppCompatActivity
找不到android.support.v7.app.AppCompatActivity的類檔案
網上找了相應的方法是執行下面的命令也就是把v7和v4加入但是不管用,還是會報
錯誤: 無法訪問android.app.Activity
D:\AndroidStudioProjects\JNITest2\app\src\main>
javah -d jni -classpath D:\Android\android-sdk-windows\platforms\android-20; D:\Android\android-sdk-windows\ extras\android\sup
port\v7\appcompat\libs\android-support-v7-appcompat.jar;..\..\build\intermediates\classes\debug edu.dushiguang.jnitest.MainActivity
有的同學有其他的說法也交流一下.
6. 編寫.c檔案
在jni資料夾下寫一個.c檔名字可以自己起.我起的名字是jni.c.程式碼如下很簡單返回一個字串就OK了.
#include "edu_dushiguang_jnitest_MainActivity.h"
JNIEXPORT jstring JNICALL Java_edu_dushiguang_jnitest_MainActivity_getStr
(JNIEnv *env, jobject jObj) {
return (*env)->NewStringUTF(env, "this is C!");
}
執行工程你會發現還是報錯,網上解釋是google的一個錯誤在jni下在建立一個.c檔案執行就OK了.
有的同學執行後也許會報下面的錯誤
Error:Execution failed for task ‘:app:compileDebugNdk’.
com.android.ide.common.process.ProcessException:
org.gradle.process.internal.ExecException: Process ‘command ‘D:\Android\android-ndk-r9d\ndk-build.cmd” finished with non-zero exit value 2.
我的解決方案是換NDK版本我換成r10的就OK了!