Windows系统下通过JNI调用dll动态库的实现
- 目的:java代码使用jni获取数据
- 工具: eclipse + Microsoft visual studio (c++)
- 业务代码:
- Java代码业务实现:
package com.weip.jni;
/**
* 操作步骤:
* 1、进到工程目录,src下
* 2、C:\Users\Administrator>e:
* E:\>cd E:\eclipse-workspace\Wp_NDK_JNI\src
* E:\eclipse-workspace\Wp_NDK_JNI\src>javah -d ../jni com.weip.jni.Test
* 3、刷新eclipse项目出现jni目录,下面有头文件 com_weip_jni_Test.h
* 4、打开visual studio ,引入头文件
*/
public class Test {
//获取字符串
public native String getTestString();
public static void main(String[] args) {
Test test = new Test();
System.out.println(test.getTestString());
}
//加载动态库
//linux:.so(Android也是linux系统) windows:.dll
static {
//加载.dll动态库
System.loadLibrary("testjni");
}
}
2、c代码的逻辑实现
test.c
最后运行java代码,可以输出一个字符串(通过jni输出)
//分析jni方法:
//一般写法:
//jstring Java_com_weip_jni_Test_getTestString
//(JNIEnv *env, jobject jobj){
// return (*env)->NewStringUTF(env, "Hello,Jni");
//}
//1.1 分析JNIEXPORT:宏定义(作用:dll动态库中允许该函数被外部调用)
//如果我们不写,编译器自动会加上
//为什么这么写?行业规范(编译动态库的规范) --固定格式
//1.2 JNICALL:用于约束函数入栈的顺序和堆栈清理规则(注意:window下的规则__stdcall)
//如果删除JNIEXPORT和JNICALL也不会报错,系统编译的时候自动会加上
//1.3 分析方法名称含义 :Java_com_weip_jni_Test_getTestString
//一种命名规范(为了区分方法) 哪个公司哪个项目哪个类的哪个方法 说白了就是唯一标识
JNIEXPORT jstring JNICALL Java_com_weip_jni_Test_getTestString
(JNIEnv *env, jobject jobj){
return (*env)->NewStringUTF(env,"Hello,Jni");
}