首页 > 技术文章 > java jni调用ddl

q95265 2017-05-26 16:17 原文

 

 

环境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

 

推荐阅读