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的下载地址.
也可以打开local.properties文件添加下面代码,
ndk.dir=D:\Android\android-ndk-r10
记得路径自己修改一下.
打开MainActivity.java文件.代码如下:
此时public native String getStr ();这句话会报红暂时不用管.
Make Project一下可以在自己的工程目录下看到有.class文件生成,例如下面的我的工程目录:
JNITest\app\build\intermediates\classes\debug\edu\dushiguang\jnitest
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
有的同学有其他的说法也交流一下.
运行工程你会发现还是报错,网上解释是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了!
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了!
相关文章推荐
- 基于vitamio5.0的android播放器
- Android中RelativeLayout各个属性的含义
- RxJava 和 RxAndroid
- Android隐藏系统输入法,隐藏软键盘
- Android 内存溢出大总结
- android多线程下载
- Android中资源命名的几点规范
- Android listview多视图嵌套多视图
- android *** Layout 07 EditText
- Android 设置程序先启动登录界面 再启动主界面
- ScrollView里面的EditText的点击空白处键盘消失的问题
- android笔记
- 【转】Android SQLite加密
- Android照片墙应用实现,再多的图片也不怕崩溃
- 在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口
- AndroidStudio快捷键
- Android 强弱指针
- Android串口操作,简化android-serialport-api的demo(附源码)
- android处理crash程序崩溃异常
- android真机 usb调试 访问电脑本地web服务地址