环境win7 64位环境
SMSUtil.java
package com.jni.ddl; public class SMSUtil { public static native int sendMsg(String msg,String phoneCode); }
步骤:
1、编译
javac com/jni/ddl/SMSUtil.java
2、通过class文件生成 头文件
javah com.jni.ddl.SMSUtil
com_jni_ddl_SMSUtil.h 文件内容
/* DO NOT EDIT THIS FILE - it is machine generated */ //#include <jni.h> 注意这里红色导入头文件部分是自动生成的,需要换成下面的方式
#include "jni.h"
/* Header for class com_jni_ddl_SMSUtil */ #ifndef _Included_com_jni_ddl_SMSUtil #define _Included_com_jni_ddl_SMSUtil #ifdef __cplusplus extern "C" { #endif /* * Class: com_jni_ddl_SMSUtil * Method: sendMsg * Signature: (Ljava/lang/String;Ljava/lang/String;)I */ JNIEXPORT jint JNICALL Java_com_jni_ddl_SMSUtil_sendMsg (JNIEnv *, jclass, jstring, jstring); #ifdef __cplusplus } #endif #endif
因为生成的头文件包含了jni.h(JAVA_HOME/include/jni.h文件),该jni.h文件又包含jni_md.h(JAVA_HOME/include/win32/jni_md.h文件)
所以制作ddl时,需要将这2个头文件copy到工程中。
3、制作ddl
通过MinGW编译
创建文件目录如图所示
jNiTest.cpp
#include "h/com_jni_ddl_SMSUtil.h" JNIEXPORT jint JNICALL Java_com_jni_ddl_SMSUtil_sendMsg (JNIEnv *, jclass, jstring, jstring) { printf("ddl");
return 1; }
h中包含3个头文件
使用g++生成ddl(命令操作:http://blog.csdn.net/cherish_2012/article/details/42120135)
注意在64位java环境中调用ddl,需要生成64位ddl
g++ -m64 -shared jniDemo.cpp -o test.dll
错误信息提示MinGW不是64位的,无法生成64位ddl
安装64位MinGW:http://www.cnblogs.com/ghj1976/p/3540257.html
生成成功的test.dll
java中调用ddl
将test.dll copy到 C:\Windows\System32 程序中直接就可以调用了
指定 -Djava.library.path的方式
java -Djava.library.path=./ddl -Djava.library.path=./ddl com.jni.ddl.Main
通过-Djava.libray.path指定ddl路径,可以相对路径,也可以绝对路径
一定注意 命令行中入口类 要在 -Djava.library.path后面,详情见 http://www.cnblogs.com/softidea/p/5240489.html
一旦JVM已经启动,则无法再修改java.library.path的内容了,也就是说,通过:
System.setProperty("java.library.path", "c:\mylib");
这样的方式是无法达到目的的
-Djava.ext.dirs的作用: http://blog.sina.com.cn/s/blog_4f925fc30102e183.html