内容: 在现有项目中加入NDK, 从.so中获取字符串
工作环境:
macOS 10.13.6
Android Studio 3.1.3
步骤:
安装NDK
image.png image.png image.png点OK后, 等待安装完成.
在build.gradle(Module:app) 中
android {
...
defaultConfig {
...
ndk{
moduleName "ndkdemo"
abiFilters "armeabi-v7a", “x86” //.so的目标编译平台
}
...
}
}
建立工具类NDKUtil
public class NDKUtil {
static {
System.loadLibrary(“ndkdemo”*)*; //动态库.so的文件名, 不用加lib前缀
}
public static native String getString();
}
生成.h头文件
点击 build -> Make Project
进入目录
[项目名]/app/build/intermediates/class/debug/com/找到NDKUtil.class文件
右键点击文件
image.png打开terminal, 输入cd空格, 黏贴上地址, 删除debug之后的字符, 进入debug目录, 回车.
输入命令 javah -jni 包名.类名 (下图示例)
image.png成功后进入debug目录中, 会获得.h文件
image.png image.png该自动生成的文件不用进行任何修改.
建立cpp文件
实现该.h头文件, 文件名可随意设置, 后面用Android.mk文件关联
#include "com_cody_ndksimpledemo_NDKUtil.h" //引入.h头文件
//实现.h中的方法
JNIEXPORT jstring JNICALL Java_com_cody_ndksimpledemo_NDKUtil_getString
(JNIEnv *env, jclass type) {
return env->NewStringUTF("Hello NDK");
}
到以下目录下建立文件夹jni
[项目文件夹]/app/src/main/jni
将生成的.h移动到该文件夹中
建立 Android.mk
在jni文件夹下建立Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := ndkdemo
LOCAL_SRC_FILES := demo.cpp
include $(BUILD_SHARED_LIBRARY)
LOCAL_MODULE 为gradle中设置的moduleName
LOCAL_SRC_FILES 实现.h的C++文件名
在gradle中添加:
android {
...
externalNativeBuild {
ndkBuild {
path 'src/main/jni/Android.mk’ //Android.mk文件所在的位置
}
}
...
}
加入调试代码
Log.d("NDK Demo", NDKUtil.getString());
运行成功的话就会打印出cpp中设定的字符了
image.png那么在.so去哪里了呢, 其实已经自动打包到apk中了, 可以使用自带的Analyze APK工具查看
image.png.apk的位置在 app/build/outputs/apk/debug/app-debug.apk
如果没找到的话可能是因为打开了Instant Run的原因, 只要点Build -> Build APK(s), 就生成了
image.png
关于Android Studio 提示错误的问题:
Cannot resolve corresponding JNI function *****
image.png
这个虽然不影响项目运行, 但是强迫症总看的不舒服, 经过查询, 这个是Android Studio的BUG, google 官方邮件组给的回答(https://issuetracker.google.com/issues/78095963#comment2)是将会在3.2时修复该问题, 所以临时的解决方法就是在class加上
@SuppressWarnings("JniMissingFunction")
等BUG修复了再删除了.
网友评论