如何在AS中加载.dll文件(Windows的动态库)

其实这是一个很没有用的操作,为什么这么说呢?因为只要是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中的代码相互对应的

运行后输出如下的结果

非常完美!只是目前没有找到应用场景,囧

猜你喜欢

转载自blog.csdn.net/qq_32019367/article/details/86619267