Android NDK开发之《HelloJni》

3 篇文章 0 订阅
2 篇文章 0 订阅

- DNK环境搭建
- 创建HelloJni工程
- 可能出现的问题


DNK环境搭建

参考上一篇 Android NDK环境配置


创建HelloJni工程

1.新建Android Application Project,命名HelloJni。主包名为com.kongge.hellojni.(命名随便,这里便于下面叙述)
2.鼠标右击工程名,找到 Android Tools-> Add Native Support…会弹出一个框,Library Name:Lib。这里可以随便填一个,例如我填的就是HelloJni,这个在后面加载库时会用到。此时会生成几个文件夹:jni,obj等。
3.创建包 com.kongge.hellojni.bean,创建类 Person.java

    public class Person {
        static{
            System.loadLibrary("HelloJni"); //HelloJni就是上面Lib的名称
        }

        public native int getSum(int a, int b); // native关键字,表示调用jni

    }

4.找到 jni 文件夹里面的.cpp文件,由于上面的Lib命名为HelloJni,所以这里是HelloJni.cpp。这里以计算 a +b 为例。

    extern "C"{
    #include <jni.h>
    #include <stdio.h>
    #include <stdlib.h>

    JNIEXPORT jint JNICALL Java_com_kongge_hellojni_bean_Person_getSum(JNIEnv* env, jobject obj, jint a, jint b){
    return a + b; //此处可能出错,往下看。
    }
    }   

5.此时.cpp文件会出现错误,右击工程名 Properties -> C/C++ Build,将Use default build command勾去掉,下面的Build command填:${NDK_ROOT}/ndk-build.cmd。NDK_ROOT在环境变量里面配过,见上方NDK环境配置。点击OK。.cpp文件就没有报错了。
6.在MainActivity中调用。

    Person person = new Person();
    System.out.println("4 + 6 = " + person.getSum(4,6));

7.点击运行,LogCat就会输出 4 + 6 = 10。大功告成!


可能出现的问题

  • 1.包名类名问题.
    • .cpp 文件中 Java_com_kongge_hellojni_bean_Person_getSum方法,”Java_”代表调用java方法;”getSum”代表java类中声明的native方法名;”Person”代表调用getSum方法的类名,与方法名用”“隔开;”com_kongge_hellojni_bean” 代表Person类的包名,中间的”.”使用”“代替;若是方法名中有下划线get_Sum(),则对应的为Java_com_kongge_hellojni_bean_Person_get_1Sum();
  • 2.虚拟机运行不起来,INSTALL_FAILED_CPU_ABI_INCOMPATIBLE
    • 我使用的是genymotion虚拟机,这个错误是由于虚拟机是x86的处理器,但是eclipse编译出来的app只能在arm架构上面运行,下载ARM补丁然后拖入虚拟机,一路点击ok然后重新启动虚拟机即可。
  • 3.补丁已经装好了,但是运行崩溃。
    • 在 jni 目录下面新建Application.mk,然后写入下面代码:APP_ABI := armeabi armeabi-v7a x86 即可。
  • 4.javah 命令的使用。

    • 打开cmd 进入到getSun()方法的包的外层目录,一般为src,然后使用 javah com.kongge.hellojni.bean.Person。此时会生成一个.h头文件,里面有

      JNIEXPORT jint JNICALL Java_com_example_hellojni_MainActivity_getSum
      (JNIEnv *, jclass, jint, jint);
    • 将该文件移动至jni目录下面,在.cpp文件中引入,并实现该方法。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值