其实这是一个很没有用的操作,为什么这么说呢?因为只要是Android开发的程序员都知道,windows只是一个开发平台(当然也有mac),开发的apk的运行平台是android手机,和windows没有了半毛钱关系。虽然没有用,但是的确可以这么做,主要是在测试代码中进行加载,因为AS的测试代码环境是windows(当然也可能是mac)
1.生成动态库
首先,在VS中创建一个CMakeLists.txt,内容如下
cmake_minimum_required (VERSION 3.8)
#这个是jdk中头文件的路径
include_directories("C:/Program Files/Java/jdk1.8.0_181/include")
include_directories("C:/Program Files/Java/jdk1.8.0_181/include/win32")
add_library(dll_file SHARED MakeDll.cpp)
include_directores():用来添加头文件的查找路径,这里将jdk中头文件路径添加进去,也不要忘了win32下的头文件
add_library():将相应的cpp文件编译成动态库,第一个参数是动态库的名称,第二个参数是动态库的标识
之后,开始编写cpp文件MakeDll.cpp,内容如下
#include <jni.h>
extern "C"
JNIEXPORT void JNICALL
Java_com_gzc_jni_ExampleUnitTest_test(JNIEnv *env,jobject instance,jint ji,jstring jstr) {
const char* str = env->GetStringUTFChars(jstr, 0);
printf("i:%d,jstr:%s",ji,str);
}
这个方法是jni形式的代码,用来和Java代码进行交互
extern "C":因为这是在cpp文件中,所以需要加上这个
void:表示Java代码中交互方法的返回值
com_gzc_jni:是包名com_gzc_jni转换的,将“.”换成“_”即可
ExampleUnitTest:是类名
test:Java代码中交互方法的方法名
jint,jstr:表示Java代码中交互方法的两个参数
之后在CMakeLists.txt进行Ctrl+s,会有如下路径输出,这个路径就是动态库生成的路径
然后再工具栏中点击CMake->全部生成,这样就在上面的路径中成了相应的动态库
有一个地方需要注意,就是下面图中红框的位置,一定要根据自己电脑的位数来选择,我的电脑是64位的,所以选择了x64的
2.在AS中进行测试
在测试代码中写如下代码
public class ExampleUnitTest {
@Test
public void addition_isCorrect() throws Exception {
System.load("C:\\Users\\codef\\CMakeBuilds\\32264e14-e3b0-ea31-94a0-076eb1e44d47\\build\\x64-Debug\\dll_file.dll");
test(10,"java_jni");
}
native void test(int i,String j);
}
可以看见类名ExampleUnitTest和test是和MakeDll.cpp中的代码相互对应的
运行后输出如下的结果
非常完美!只是目前没有找到应用场景,囧