本文主要参考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\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
注意!这里会报错
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方法