Android Studio 2.2.3封装JNI

  工作需要为安卓层的同事封装JAVA的jni接口,网上查了很多资料,有用eclipse的,有用老版AS的,非常的麻烦,而且我试过后都不行。

  我所使用的是Android Studio 2.2.3,网上相关的资料很少,开始时总是不行,后发现自己开始就错过了关键的一点!

  

  Include C++ support!这一项一定点选上!!

  最后的目录截图是这样的 

  

  会自动生成CPP文件夹以及相关的C++文件,更人性化的是,开局自带example!

  接下来make project,然后也不是别人写的多lib等文件夹,而是出现了,没错是cmake文件夹

  下级的obj就是生成的.SO的库。

  下面是cpp文件的一些编写问题

  首先,c++文件中的log想在logcat里面打印出来,用printf,cout是没用的!!做安卓的同事告诉我能!然而并不能,打印LOG必须用如下方式

#include<android/log.h>
#define LOG_TAG    "hpc -- JNILOG" // 这个是自定义的LOG的标识
//#undef LOG // 取消默认的LOG
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG, __VA_ARGS__)

  ANDROID_LOG_INFO:是日志级别;
  TAG:是要过滤的标签,可以在LogCat视图中过滤。
  __VA_ARGS__:是实际的日志内容。
  完成上面2步之后,我们就可以在.c/cpp文件中添加LOGI、LOGD、LOGE去打印信息!使用LOGI、LOGD、LOGE的方法和使用printf一样
  1.3日志类型
  1)Log.v 的调试颜色为黑色的,任何消息都会输出,这里的v代表verbose啰嗦的意思,平时使用就是Log.v(,);
  2)Log.d的输出颜色是蓝色的,仅输出debug调试的意思,但他会输出上层的信息,过滤起来可以通过DDMS的Logcat标签来选择
  3)Log.i的输出为绿色,一般提示性的消息information,它不会输出Log.v和Log.d的信息,但会显示i、w和e的信息
  4)Log.w的意思为橙色,可以看作为warning警告,一般需要我们注意优化Android代码,同时选择它后还会输出Log.e的信息。
  5)Log.e为红色,可以想到error错误,这里仅显示红色的错误信息,这些错误就需要我们认真的分析,查看栈的信息了。

  关于找不到so中函数的问题

  很多难解决的问题,在最后会发现是最基本的问题,我的问题是:extern "C" 后的 jni函数只有第一个生效,后面的调用时都报错找不到,原因也是出乎意料,就是extern "C"的默认作用范围仅是第一个函数~简直坑爹,没错,加个{}明确extern "C"的作用范围就OK了。

 

 

 

posted on 2017-02-08 16:06  一念|  阅读(1398)  评论(0编辑  收藏  举报

导航