Android Studio JNI開發

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


1首先下載NDK.在Android中配置NDK.

以下圖所示:
這裏寫圖片描述
也能夠打開local.properties文件添加下面代碼,
ndk.dir=D:\Android\android-ndk-r10
記得路徑本身修改一下.linux

2. 在mian文件夾下新建jni文件夾,打開app 的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文件.代碼以下: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

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文件夾.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

6. 編寫.c文件

在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

相關文章
相關標籤/搜索