AndroidStudio使用jni

 
 

温馨提示:如果你的 Android Studio 版本在 2.2 以上 , 建议你用 cMake 的新姿势进行 NDK 开发 : http://www.jianshu.com/p/e03028f826d7 我相信你会爱上 cMake 的;

本文demo下载地址:http://download.csdn.net/download/fisher_3/10118866
1. 环境搭建

俗话说 “工欲善其事,必先利其器” ;所以咱还是得先下载 ndk; 下载地址 :https://developer.android.com/ndk/downloads/index.html(需要翻墙,你懂得) 或者可以直接在 Android Studio 里面下载,这就可以免去翻墙, File-->Project Structure

image1.png

如果你已经下载,直接选择你 ndk 的位置; 如果没有下载,在红色框这个位置会有位置提示你下载,点击下载就行; 添加 ndk 后你会在 local.properties 这个文件看到(路径取决于你 ndk 的位置):

image2.png

莫慌,还差最后一步:

image3.png

在此处加上这句代码:android.useDeprecatedNdk=true 好了,ndk 环境搭建完毕!

2. java 代码与 c 代码编写

首先新建个 java 类

public class JniTest{
    static {
        System.loadLibrary("jary");
    }
    public native String getString();
}

然后重新编译下你的 Project: Build-->Make Project(Ctrl+F9)
重新编译之后就可以在对应的文件夹看到编译后的 JniTest.class
C:\ASworkspace\MyJniTest\app\build\intermediates\classes\debug\jary\com\myjnitest


image4.png


下一步来看怎么生成 .h 的文件
在 studio 打开 Terminal 命令行工具,打开步骤是 View-->Tool Windows-->Terminal (Alt+F12)

在命令行中先进入到工程的 main 目录下
输入命令:javah -d jni -classpath 自己编译后的 class 文件的绝对路径
例如:javah -d jni -classpath
C:\ASworkspace\MyJniTest\app\build\intermediates\classes\debug jary.com.myjnitest.JniTest
注意 debug 后面是有个空格的,如图:


image5.png


命令执行后会在 main 目录下(在哪个目录下执行就会在哪个目录下生成 .h 文件)自动生成 “jni” 文件夹,同时生成一个 .h 的文件


imag6.png

这个 .h 文件可不做修改 ;默认就行
现在我们来写一个测试的 C 文件 jary.c 同 .h 文件一样放到 jni 文件夹下,代码如下:


image7.png

依赖刚才生成的 .h 头文件 ; 方法名与 .h 里面方法名保持一致 ;
最后在 build.gradle defaultConfig 中添加如下代码

 ndk {   
        moduleName "jary"         //生成的so名字    
        abiFilters "armeabi", "armeabi-v7a", "x86"  //输出指定三种abi体系结构下的so库。    
        stl "stlport_static"    //打开.c 的 debug , 下面第 4 点会讲到
      }

到这里,jni 调 C 就完成了,现在我们来测试一下,写个 TextView 显示一下调用的 C:

public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    TextView tvJni = (TextView) findViewById(R.id.tvJni);
    tvJni.setText(new JniTest().getString());
}
}

效果如下图 :


image8.png
3. 生成 .so 以及调用

编译后的 .so 文件如下图路径:


image9.png

根据这个路径就可以找到指定输出的三种体系结构下的 .so 文件,然后把 .so 文件复制出来,如下图所示的放到 jniLibs 文件夹下面,如下图:


image10.png

注意: 放到 jniLibs 文件夹下面,build.gradle 里面什么都可以不用配置

还有一种方式是将 .so 文件 放在 libs 文件夹下面,注意在 build.gradle 添加如下配置:


iamge11.png
4. 关于ndk开发在 .c 文件里面的 debug

首先在 build.gradle 中添加如下代码 :

android {
    ... ...
  defaultConfig {
      ... ...
     ndk {   
        moduleName "jary"         //生成的so名字    
        abiFilters "armeabi", "armeabi-v7a", "x86"  //输出指定三种abi体系结构下的so库。    
        stl "stlport_static"    //打开.c 的 debug (此句是打开的debug的关键)
     }
  }
  buildTypes {
     debug {    
            jniDebuggable true //此句不加在真机上 debug 不受影响,但是在虚拟机上不能 debug
     }
  }

配置后如下图 ,会出现一个 app-native,选择此项你就可以尽情的 debug 了:


image12.png

debug 如下图:


image13.png





作者:jarylan
链接:http://www.jianshu.com/p/e7c2c63fa70e
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值