本文主要参考blog:http://blog.csdn.net/jkan2001/article/details/54316375

下面是本人结合blog生成so包过程中遇到一些问题和解决方法

(1)新建一个android项目,增加native方法

 package update.smartapp.com.myso;

 /**
* Created by qinpeizhou on 17-5-12.
*/ public class JNIUtils {
static {
System.loadLibrary("NativeExample");
} public static native String getStringFromNative(); }

(2)执行Build->Make Project方法

执行完这一步后,我们会在项目的app\build\intermediates\classes\debug路径下发现编译成功的项目class文件

(3)生成jni包和.h文件

   方法一:

进入src/main/java文件夹

  qinpeizhou@qinpeizhou-PC:~/Documents/AsDemo/MySO$ cd app/src/main/java

执行命令生成jni包和.h文件

  javah -d jni update.smartapp.com.myso.JNIUtils

然后把java包里面的jni包拖到main包里面否则在app\build\intermediates生成不了ndk这个包

  方法二:

进入src/main文件夹

  qinpeizhou@qinpeizhou-PC:~/Documents/AsDemo/MySO$ cd app/src/main

再输入javah -d jni -classpath [你的sdk路径]\platforms\Android-22\android.jar;….\build\intermediates\classes\debug [你的包名+包含native方法

  qinpeizhou@qinpeizhou-PC:~/Documents/AsDemo/MySO$ javah -d jni -classpath \home\qinpeizhou\Documents\android-sdk-macosx\platforms\Android-22\android.jar;..\..\build\intermediates\classes

  \debug  com.exmple.root.solo.NativeUtils

这个生成的jni包是在main下的,强烈建议NDK版本选r9+的最好不用r13版本的,因为r13我用的报错不断~

(5)实现.h中的方法

拷贝自动生成的.h方法,到jni里,并重命名为main.c,并编写main.c中的代码,实现native方法

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class update_smartapp_com_myso_JNIUtils */ #ifndef _Included_update_smartapp_com_myso_JNIUtils
#define _Included_update_smartapp_com_myso_JNIUtils
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: update_smartapp_com_myso_JNIUtils
* Method: getStringFromNative
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_update_smartapp_com_myso_JNIUtils_getStringFromNative
(JNIEnv *env, jclass jobj){
return (*env)->NewStringUTF(env,"Hello From JNI!");} #ifdef __cplusplus
}
#endif
#endif

注意!这里会报错

 Error:Execution failed for task ':app:compileDebugNdk'.
> Error: Flag android.useDeprecatedNdk is no longer supported and will be removed in the next version of Android Studio. Please switch to a supported build system.

这是因为我们没有配置NDK路径的问题

(5)配置NDK路径等等

打开Project的local.properties文件添加NDK路径ndk.dir=C\:\\work\\sorfware\\android\\android-ndk-r10e
在gradle.properties添加android.useDeprecatedNdk=true
在app路径的build.gradle 的defaultconfig中添加

ndk {
moduleName "NativeExample" //设置库(so)文件名称
ldLibs "log", "z", "m" //添加系统库
abiFilters "armeabi", "armeabi-v7a", "x86" //生成3中类的.so文件
}

注意:注意在jni包内添加空.c文件或者.c文件的mian函数会报main函数重复问题,main函数重复就把该.c文件的main函数改成main1.c等等

(6)使用.so文件

在本项目中使用.so文件,首先在main包下创建jniLibs包把.so文件所在的armeabi,armeabi-v7a,x86包都复制在里面

调用native方法

最新文章

  1. PAT/字符串处理习题集(一)
  2. 手写代码自动实现自动布局,即Auto Layout的使用
  3. aws在线技术峰会笔记-游戏解决方案
  4. JQuery:JQuery遍历详解
  5. python file operation
  6. php 正则校验是否是域名
  7. Android 解决双卡双待手机解析短信异常
  8. php根据经纬度计算距离和方向--摘录自http://haotushu.sinaapp.com/post-520.html
  9. linux内核学习之进程管理------task_struct结构体
  10. jquery ajax 参数可以序列化
  11. Sublime Text 安装插件
  12. 链接文本在a标签内标签里也可以用driver.find_element_by_link_text
  13. 【C++ Primer 第7章】定义抽象数据类型
  14. 5.7 C++函数调用操作符重载
  15. (GoRails )使用Vue.js制作拖拉list功能(v1-4) gem &#39;acts_as_list&#39;(自动排列顺序)
  16. JAVA 时间&quot;dd/MMM/yyyy:HH:mm:ss Z&quot;, Locale.US
  17. ubuntu安装wine的方法
  18. python名称空间介绍
  19. java线程一之创建线程、线程池以及多线程运行时间统计
  20. 剑指offer-高质量的代码

热门文章

  1. 跟我一起使用create-react-app脚手架搭建vw-layout解决方案
  2. 流程控制&amp;&amp;函数
  3. 基于知识图谱的APT组织追踪治理
  4. disruptor 高效队列
  5. python学习笔记4.2_正则表达式
  6. &lt;每日一题&gt;题目27:插入排序(假)
  7. [Turn]C# 强制关闭当前程序进程(完全Kill掉不留痕迹)
  8. php 7.2下mcrypt扩展支持附带的问题
  9. wpf中数据绑定和INotifyPeropertyChanged的理解
  10. js 引入Vue.js实现vue效果