建议先看一看jni的手动配置方法
https://blog.youkuaiyun.com/we1less/article/details/108691477
配置环节
1.进入Project Structure界面 配置NDK 没有下载一个
2.在项目的local.properties文件中同样配置一下(其实这块是自动生成的)
3.在gradle.properties文件中加上一行:
android.useDeprecatedNdk=true
4.在External Tools下配置两个插件。Settings --> Tools --> ExternalTools 点击+号增加。
Program: 这里配置的是JDK目录下的javah.exe的路径。注意没有环境变量就直接找到对应jdk的路径下的 javah.exe
$JDKPath$\bin\javah.exe
Parametes: $FileClass$指的是要执行操作的类名(即我们操作的文件)
$ModuleFileDir$/src/main/jni表示生成的文件保存在这个module目录的src/main/jni目录下。
-classpath . -jni -d $ModuleFileDir$/src/main/jni $FileClass$
Working: module目录下的src\main\java目录。
$ModuleFileDir$\src\main\java
使用方式:选中java文件-->右键-->External Tools-->javah-jni,将生成jni文件夹以及文件夹下的 包名.类名的.h头文件
5.ndk -build命令,是根据C/C++文件生成so文件的。
Program: 这里配置的是ndk下的ndk-build.cmd的路径。
E:\androidSDK\ndk\21.3.6528147\ndk-build.cmd
Working:
$ModuleFileDir$\src\main\
使用方式:选中C/C++文件-->右键-->ExternalTools-->ndk-build,将在main文件夹下生成libs文件夹以及多个so文件,我们可以移动至jniLibs目录下去。
6.在jni目录下增加两个文件 Android.mk
LOCAL_PATH := $(call my-dir) // 设置当前的编译目录(Android.mk所在的目录)
include $(CLEAR_VARS) // 清除LOCAL_XX变量(LOCAL_PATH除外)
LOCAL_MODULE := JNI_ANDROID_AUDIO// 指定当前编译模块的名称
LOCAL_SRC_FILES := NativePlayer.cpp // 编译模块需要的源文件
include $(BUILD_SHARED_LIBRARY) // 指定编译出的库类型,BUILD_SHARED_LIBRARY:动态库;BUILD_STATIC_LIBRARY:静态库, BUILD_EXECUTEABLE指:可执行文件
如果要生成多个模块
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JNI_STATIC_ANDROID_AUDIO1
LOCAL_SRC_FILES := NativePlayer.cpp
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := JNI_DYNAMIC_ANDROID_AUDIO2
LOCAL_SRC_FILES := NativePlayer2.cpp
include $(BUILD_SHARED_LIBRARY)
7.在jni目录下增加两个文件 Application.mk
APP_ABI 有四种类型(默认armeabi),armeabi、armeabi-v7a、x86、mips,设置时以空格隔开,all表示所有。
APP_MODULES 文件中的可选配置 的类似于上面Android.mk文件中的LOCAL_MODULE,以空格隔开,且会覆盖掉Android.mk文件中的LOCAL_MODULE设置(比如Android.mk文件中的写了两个jni库的配置,LOCAL_MODULE := JNI1、LOCAL_MODULE := JNI2,而Application.mk中设置的APP_MODULES := JNI1,则只能生成JNI1的so文件,要生成JNI2的so文件的时候会报错,除非写成APP_MODULES := JNI1 JNI2,这里我们直接省略默认使用Android.mk中的)。
APP_ABI := all
这时候我们可以在main目录下新建jniLibs文件夹,把生成的libs文件夹内的东西均复制过去,删除新生成的jni、libs、obj三个文件夹。
最后附上几个c++env的调用方法形式
jstring str = env->NewStringUTF("Im godv !");