NDK使用与问题解决

JNI
1.ndk-build
ndk下载,
ndk和sdk版本, minSdkVersion
配置:
build.gradle jniLib.src
Android.mk
Application.mk
ndk-build时需要进入jni目录:
cd /Users/giuhare/ASWork/JiNanGrid/app/src/main/jni

2.生成头文件
编写native方法
生成头文件,需.class文件
命令:
生成.class文件:
javah -classpath /Users/giuhare/ASWork/JiNanGrid/app/src/main/java -d jh com.tianque.sgcp.util.sound_recorder.SimpleLame
javah -classpath /Users/giuhare/Library/Android/sdk/platforms/android-26/android.jar;. -jni com.tianque.sgcp.util.sound_recorder.SimpleLame.class

javah -classpath D:\360PhoneInfo\small-video-record-master\SmallVideoRecord2\testndk\build\intermediates\classes\debug -d jni
com.example.testndk.JniKit

3.java.lang.UnsatisfiedLinkError: No implementation found for解决方案
(1)分析原因:
确保包名正确,so文件里的方法packageName+类名
jni 调用类的路径一定要一致。也就是说 .so中函数声明涉及到的package name和class name与调用它的package name和class name不符。因此我们要改变我们工程中的package name和class name。使其与.so文件中函数签名提示的一致,在这个类中加入native方法的声明。
JNI接口 Java_com_netease_xtc_cloudmusic_utils_NeteaseMusicUtils_nativeInit 中,com.netease.xtc.cloudmusic.utils 代表的是 package name ,NeteaseMusicUtils 则是 class name。

而第三方提供so库的工作人员的c文件的定义JNI接口为Java_com_netease_cloudmusic_utils_NeteaseMusicUtils_nativeInit,即: package name 必须为: com.netease.cloudmusic.utils ,而class name 必须为 NeteaseMusicUtils 。
native这个就是我们提供出去的方法,这个方法到时候要和.c文件里面或者.cc文件里面的方法名一致。
(2)确保lib下个目录,so文件数量一致:
将apk解压后查看lib,发现果然so目录文件不一致。libBugly.so在5个目录(腾讯bugly使用的so库),armeabi下,是厂家提供的so库。
解决途径
提供armv7编译的libA.so放入armeabi-v7a下,补齐各架构所需要的SO。
把armeabi-v7a目录去掉,默认armv7下也能使用armeabi下的SO。
(3)要么你就在main/下新建一个JniLibs文件夹,再把SDK里带的so文件目录诸如armeabi等等文件夹丢进去就可以了。
把放so文件的目录诸如armeabi直接放在放jar文件的目录libs里头,
然后修改build.gradle文件的内容,添加上
android {
  sourceSets{
    main{ jniLibs.srcDirs=[‘Libs’]
  }
}
4.Android NDK: WARNING: APP_PLATFORM android-14 is larger than android:minSdkVersion 7解决方案
Application中 APP_PLATFORM = android-14
和build.gradle的minSdkVersion版本问题,最好保持一致
出现此错误的其他原因:
(1)ndk版本太高。ndk版本和sdk版本要匹配
(2)ndk配置错误,环境未正确配置

ndk版本下载:
在AndroidStudio里更改版本,选中show package Detail
NDK使用与问题解决_第1张图片
NDK使用与问题解决_第2张图片
5.Android NDK: APP_STL stlport_static is no longer supported
Android studio 中 ndk版本过高导致的
6.集成mp3recorder:library
dependencies {
compile ‘com.czt.mp3recorder:library:1.0.4’
}
创建MP3Recorder, 传入录音文件的File对象。
MP3Recorder mRecorder = new MP3Recorder(new File(Environment.getExternalStorageDirectory(),“test.mp3”));
开始录音: 调用MP3Recorder对象的start()方法。
mRecorder.start();
停止录音: 调用MP3Recorder对象的stop()方法。
mRecorder.stop();

7.Android关于libs,jniLibs库的基本使用说明及冲突解决
如果是在Android Studio中,则会默认匹配main下的jniLibs目录,如果没有目录需要自己手动创建。并且库的名称也不能随便更改。
但是这里会有一个问题,就是如果使用的是AndroidStudio,但是想用libs下的库,还需要手动去指定库的位置:
sourceSets {
main {
jniLibs.srcDirs = [‘libs’]

}

}
在集成第三方服务商sdk的时候,大多数都会让你下载demo,或者是SDK集合包,让你直接拷贝整个libs或者jniLibs目录,合并本地项目。这样就会出问题。
如果你要集成前面两家的sdk,显然就会出现冲突。

build配置后,jniLibs库就无法被识别。但是不配置的话,libs库无法识别。
结果是改来改去总有一方库无法加载.so文件。

所以要解决的话,就抛弃前面的文档吧。
正确姿势是把所有的.so所对应的库要么全部放在libs,要么全部放在jniLibs。
eclipse现在的使用者已经很少了,所以还是以Android Studio为主。建议全部放在jniLibs,不需要额外的任何配置。

你可能感兴趣的:(NDK使用,安卓开发)