Android中实现jni必备的操作:
src/main/下创建jni目录,将以下文件都放到此目录中
1:源文件 —— 包含native方法的文件
2:.h头文件,用Javah进行编译
- native方法中引用了android的类
在jni目录下运行以下命令:
sdk中目录下的jar包路径:sdkpath = ..\Sdk\platforms\android-28\android.jar
class文件路径(不存在时用Make Project自动生成):classpath = ...\app\build\intermediates\javac\debug\compileDebugJavaWithJavac\classes
javah -bootclasspath sdkpath -jni -classpath 带包名的native类(xx.xx.x) 会在jni目录中生成.h的头文件
在class目录中生成头文件命令如下:
javah -classpath sdkpath; -jni 带包名的native类(xx.xx.x)
3:.c文件
实现源文件中native方法,需要引用.h头文件
4:.mk文件
- Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := jnitest //so库文件名
LOCAL_SRC_FILES := test.c //c文件名称
include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH:必须位于android.mk文件的开始,用来定位源文件的位置,$(call my-dir)返回当前路径,即android.mk所在的目录
include $(CLEAR_VARS):清除变量的值,不包括LOCAL_PATH
LOCAL_MODULE:描述的模块,名字唯一,不能有空格,编译系统会生成合适的前缀和后缀
LOCAL_SRC_FILES:参与编译的所有源代码文件
include $(BUILD_SHARED_LIBRARY):把当前模块编译为共享库,前缀为lib,后缀为.so
include$(BUILD_STATIC_LIBRARY):把当前模块编译为静态库,前缀为lib,后缀为.a
- Application.mk
编译so库支持的cpu架构,all为所有架构; 多个用空格隔开,如armeabi-v7a x86
APP_API := all
5:编译so文件并加载
在jni目录下执行 ndk-build命令即可在src/main/libs目录下生成so文件
6:在源文件中加载so库
static { System.loadLibrary("jnitest"); }
7:创建项目时未选择include c/c++,所以gradle文件添加:
externalNativeBuild {
ndkBuild {
path 'src/main/jni/Android.mk'
}
Android.mk 与Application.mk文件的作用及使用说明转载自https://blog.csdn.net/cgwang_1580/article/details/80719974