您的位置:首页 > 移动开发 > Android开发

Android Studio JNI开发

2016-02-01 15:37 627 查看
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的下载地址.

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了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: