博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android Studio JNI开发
阅读量:5961 次
发布时间:2019-06-19

本文共 3131 字,大约阅读时间需要 10 分钟。

hot3.png

Android Studio JNI开发

上面是一部分NDK的下载地址.


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

如下图所示:

这里写图片描述
也可以打开local.properties文件添加下面代码,
ndk.dir=D:\Android\android-ndk-r10
记得路径自己修改一下.

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文件.代码如下:

public class MainActivity extends Activity {      private TextView tv;    public native String getStr ();    static {    System.loadLibrary("jniTest");}@Overrideprotected 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了!

转载于:https://my.oschina.net/SunnyTime/blog/612612

你可能感兴趣的文章
Vue $nextTick 两种写法的差异
查看>>
传说中的git到底怎么搞?安装、文件修改管理等
查看>>
goreplay 使用教程
查看>>
Block
查看>>
for in,Object.keys,for of 的区别
查看>>
结构型设计模式之桥接模式
查看>>
深入理解nodejs Stream模块
查看>>
java版spring cloud+spring boot+redis多租户社交电子商务平台:服务消费(Feign)
查看>>
ios手机QQ无发改变title问题
查看>>
深入理解ES6 ---- 正则扩展
查看>>
activiti总结(一)流程图结构简介
查看>>
dom节点和vue中template浅谈
查看>>
第三方开源框架(一)
查看>>
JSONP跨域
查看>>
对js陀螺仪的认知理解
查看>>
react native scrollView定时器广告位
查看>>
如何在vue中使用ts开发
查看>>
学习vim其实很简单
查看>>
刘强东解读京东AI战略:无人仓无人配送都在布局
查看>>
redux源码分析
查看>>