1. 程式人生 > >Android Studio JNI開發

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了!