博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JNI初级:android studio生成so文件详细过程
阅读量:5292 次
发布时间:2019-06-14

本文共 2622 字,大约阅读时间需要 8 分钟。

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

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

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

1 package update.smartapp.com.myso; 2  3 /** 4 * Created by qinpeizhou on 17-5-12. 5 */ 6  7 public class JNIUtils { 8 static { 9 System.loadLibrary("NativeExample");10 }11 12 public static native String getStringFromNative();13 14 }

 

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

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

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

   方法一:

    进入src/main/java文件夹 

  

1  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\-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 
/* Header for class update_smartapp_com_myso_JNIUtils */#ifndef _Included_update_smartapp_com_myso_JNIUtils#define _Included_update_smartapp_com_myso_JNIUtils#ifdef __cplusplusextern "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

 

注意!这里会报错

1 Error:Execution failed for task ':app:compileDebugNdk'.2 > 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方法

     

   

 

转载于:https://www.cnblogs.com/mrszhou/p/6859137.html

你可能感兴趣的文章
Vue 模板解释
查看>>
http://www.bootcss.com/
查看>>
20145308 《网络对抗》 注入shellcode+Return-to-libc攻击 学习总结
查看>>
将多张图片和文字合成一张图片
查看>>
自己动手写ORM(01):解析表达式树生成Sql碎片
查看>>
如何使用USBWebserver在本机快速建立网站测试环境
查看>>
百度Ueditor编辑器的Html模式自动替换样式的解决方法
查看>>
变量提升
查看>>
线性表可用顺序表或链表存储的优缺点
查看>>
在现有的mysql主从基础上,搭建mycat实现数据的读写分离
查看>>
opencv安装配置
查看>>
[Flex] flex手机项目如何限制横竖屏?只允许横屏?
查看>>
tensorflow的graph和session
查看>>
6-1 并行程序模拟 uva210
查看>>
JavaScript动画打开半透明提示层
查看>>
Mybatis生成resulteMap时的注意事项
查看>>
jquery-jqzoom 插件 用例
查看>>
1007. Maximum Subsequence Sum (25)
查看>>
《算法》C++代码 快速排序
查看>>
iframe的父子层跨域 用了百度的postMessage()方法
查看>>