NDK工具开发Jni,Android studio jni开发

NDK工具开发JNI

对于JNI的作用,我这边就不详细说明了,百度google 有很多这样的介绍,这边着重详解AS使用NDK工具开发,调C的流程.

    1,创建工程

    2,创建native方法

 
  1. //该类的路径在main目录任意包下即可
  2. public class JniUtils {
  3.    public static native String getStringFromC();
  4. }

    3,  配置ndk的路径,如果没有自行到 http://www.androiddevtools.cn/ 下载,或者翻墙同步下,自动下载. 


    4,在app项目下gradle的 defaultConfig{ }内添加

 
  1. ndk {    
  2.  //生成的so名字
  3.   moduleName "JniDemo"  
  4. }

    5,项目的根目录下找到 gradle.properties 添加语句

 
  1. android.useDeprecatedNdk=true

    6,到指定class包的根目录下,使用jni编译h 文件.

 
  1. //注意这里是包的根目录,而不是class文件的子目录
  2. cd  class文件路径/intermediates/classes/debug

  编译h 文件:

 
  1. //紧接着上一步terminal 编译 h文件
  2. javah  -jni com.relicemxd.jnidemo.ndk.JniUtils
  3. //你也可以指定编译的h 文件到指定目录
  4. javah  -d /这里是app项目的路径/JniDemo/app/src/main/jni -jni com.relicemxd.jnidemo.ndk.JniUtils

      7,复制刚生成的 .h文件到 mian/jni 下



 下面是.c文件的代码实现:

  
  1. #include "com_relicemxd_jnidemo_ndk_JniUtils.h"
  2. //这里是C代码的实现
  3. JNIEXPORT jstring JNICALL Java_com_relicemxd_jnidemo_ndk_JniUtils_getStringFromC
  4.        (JNIEnv *env, jclass cls) {
  5.    return (*env)->NewStringUTF(env, "这是来自C的string !");
  6. }
      8,在activity代码中加动态库

          static{

                System.loadLibrary("JniDemo");//.so文件名,注意这里的名字要与gradle的命名一致
          }
    9,调用native方法

 activity调用 native 就可以获取c的输出了.
    10,运行结果

欢迎star, 有问题可以issue.

demo : https://github.com/relice/JniDemo





注意问题:

错误1:未指定类.

原因: 

javah 命令执行条件是,包的路径与终端执行的路径一致(不可在子路径下执行)

解决:

cd 进入的路径要在class包下的根目录




错误2: java.lang.UnsatisfiedLinkError: No implementation found for java.lang.String

原因:

javah生成的头文件与 main目录下的头文件不一致.

解决:

step1.则要重新clean project ->build project ,否则项目会有缓存,编译照样报错的.

step2.javah -d 指定scr/mian目录下生成头文件 -jni 包名+类名




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值