Android Studio JNI開發
http://dl.google.com/android/ndk/android-ndk32-r10-windows-x86.zip
http://dl.google.com/android/ndk/android-ndk32-r10-windows-x86_64.zip
http://dl.google.com/android/ndk/android-ndk32-r10-darwin-x86.tar.bz2
http://dl.google.com/android/ndk/android-ndk32-r10-darwin-x86_64.tar.bz2
http://dl.google.com/android/ndk/android-ndk32-r10-linux-x86.tar.bz2
http://dl.google.com/android/ndk/android-ndk32-r10-linux-x86_64.tar.bz2
http://dl.google.com/android/ndk/android-ndk64-r10-windows-x86.zip
http://dl.google.com/android/ndk/android-ndk64-r10-windows-x86_64.zip
http://dl.google.com/android/ndk/android-ndk64-r10-darwin-x86.tar.bz2
http://dl.google.com/android/ndk/android-ndk64-r10-darwin-x86_64.tar.bz2
http://dl.google.com/android/ndk/android-ndk64-r10-linux-x86.tar.bz2
http://dl.google.com/android/ndk/android-ndk64-r10-linux-x86_64.tar.bz2
上面是一部分NDK的下載地址.java
以下圖所示:
也能夠打開local.properties文件添加下面代碼,
ndk.dir=D:\Android\android-ndk-r10
記得路徑本身修改一下.linux
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' }
android.useDeprecatedNdk=true
打開MainActivity.java文件.代碼以下:android
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\jnitestwindows
進入到本身的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文件夾.app
另外網上有些朋友給出的命令是:
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
有的同窗有其餘的說法也交流一下.ide
在jni文件夾下寫一個.c文件名字能夠本身起.我起的名字是jni.c.代碼以下很簡單返回一個字符串就OK了.gradle
#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了.ui
有的同窗運行後也許會報下面的錯誤
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了!this