我有一个用c写的dll,java程序汇总想用jni调用。 恩?我现在有一个现成的dll.那java中就不能调用了?? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 现成的DLL,JAVA不能直接调用,里边没有JAVA的导出声明使用现有的DLL的话,你可以自己建立DLL工程,在这个工程里边导入你的DLL,声明要这个工程里使用的该DLL的导出函数,同时把你JAVA中生成.h头文件导入,实现.h头文件中的导出函数,在这个导出函数里边,你就可以使用你本地DLL导入的函数。 << 看了论坛中的其他帖子,好象jni调用的例子大都是 xx.java 然后用javah编译成.h 然后出来.c 然后生成dll. 就是在.c中实现对dll中的方法的调用。是吗?我刚刚接触jni,项目又比较急,能给一些代码吗? 你是指java调用系统dll或者非java导出格式的那种dll 的例子?如果是直接JAVA调用自己写的包含JAVA标准导出函数的dll,网上例子很多调用其他dll 的我抽空给你写一个 C语言如何调用DLL你应该知道吧,你就用Java调用你自己的JNI,JNI去掉用你已经有的DLL to : fast_time(fast_time) < 你就用Java调用你自己的JNI,JNI去掉用你已经有的DLL关键是我现在只有一个dll , 这个时候,怎么写自己的jni呢? 写了个简单的调用,楼主可以自行修改,编译器用VC6+SP6JAVA调用JNITest这个含有JAVA标准导出格式的DLL,JNITest.dll又去调用一个非JAVA标准导出格式的DLL--MyTestJNI.dll,当然这个dll可以换成系统dll-----------------------------------------------------------------------JAVA 文件://MsgBox.javapackage jnitest;public class MsgBox { static{ System.loadLibrary("JNITest"); } public native void showMsgBox(int n); }//TestJNI.javaimport jnitest.MsgBox;public class TestJNI { public static void main(String[] args) { MsgBox box = new MsgBox(); box.showMsgBox(10); }}编译成功后, 运行javah jnitest.MsgBox 生成 C头文件 jnitest_MsgBox.h //jnitest_MsgBox.h/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class jnitest_MsgBox */#ifndef _Included_jnitest_MsgBox#define _Included_jnitest_MsgBox#ifdef __cplusplusextern "C" {#endif/* * Class: jnitest_MsgBox * Method: showMsgBox * Signature: (I)V */JNIEXPORT void JNICALL Java_jnitest_MsgBox_showMsgBox (JNIEnv *, jobject, jint);#ifdef __cplusplus}#endif#endif------------------------------------------------------------------------然后建立VC工程,准备生成MyTestJNI.dll这里用一个最简单的计算函数示例吧,它求出一个整数的平方//myFun.h#ifndef __MYFUN_H_INCLUDE#define __MYFUN_H_INCLUDE#ifdef __cplusplusextern "C"{#endif //__cplusplus//示例函数,计算整数的平方__declspec(dllexport) int mySQRT(int n);#ifdef __cplusplus}#endif //__cplusplus#endif //__MYFUN_H_INCLUDE-----------------------------------------------------------------------// MyTestJNI.cpp : Defines the entry point for the DLL application.//#include "stdafx.h"#include "myFun.h"BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ){ return TRUE;}__declspec(dllexport) int mySQRT(int n){ return n*n;}编译生成MyTestJNI.dll和MyTestJNI.lib然后建立包含JAVA标准导出函数的DLL文件JNITest.dll------------------------------------------------------------------------把jnitest_MsgBox.h添加到自己的DLL工程中,同时把上步生成的MyTestJNI.dll和MyTestJNI.lib复制到当前工程Debug目录下,然后编辑JNITest.cpp:// JNITest.cpp : Defines the entry point for the DLL application.//#include "stdafx.h"#include "jnitest_MsgBox.h"//声明导出函数,底下导入MyTestJNI到此工程extern "C" __declspec(dllexport) int mySQRT(int n); #pragma comment(lib,"debug/MyTestJNI")BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ){ return TRUE;}JNIEXPORT void JNICALL Java_jnitest_MsgBox_showMsgBox(JNIEnv * env, jobject obj, jint n){ int m=(int)n; int d=mySQRT(m); //调用该MyTestJNI.dll中的mySQRT函数 char* str=new char[20]; sprintf(str,"平方是 %d",d); MessageBox(NULL,str,"Java 调用",MB_OK); delete str;}//////////////////////////////////////////////////////////编译当前工程生成JNITest.dll至此,两个DLL均生成完毕,复制两个DLL文件到JAVA文件所在目录,运行java TestJNI 是不是看到对话框,平方是100 OK,这只是个简单的例子,楼主可自行修改MyTestJNI DLL工程里的函数以实现一些底层操作。吃饭~~~ 一个小BUG,当然编译不会出错,但是会造成内存泄漏,呵呵delete str ==> delete[] str;...JNIEXPORT void JNICALL Java_jnitest_MsgBox_showMsgBox(JNIEnv * env, jobject obj, jint n){ int m=(int)n; int d=mySQRT(m); //调用该MyTestJNI.dll中的mySQRT函数 char* str=new char[20]; sprintf(str,"平方是 %d",d); MessageBox(NULL,str,"Java 调用",MB_OK); //delete str; delete[] str;} 我做最后的dll时,怎么提示“jni.h”文件找不到,我已经把jdk下的jni.h copy到对应的目录了啊。急 呵呵。上面的问题解决了。例子也运行成功了。但是,现在又新的问题:因为在生成dll的时候,有对应的.lib文件,所以,#pragma comment(lib,"debug/MyTestJNI")不会有问题.而我现在只有一个dll,和一个对应的ini文件.如何vc++中引用没有lib的 dll. 有一个题,有些不解,求各位帮忙理解一下 spring security 无法获取当前用户 求一个struts2 spring hibernate的网上商城源码 Ext的树向表拖拽的问题,帮我解决下 监听端口 JAVA实现RSS struts中引入javascript问题 请高手帮忙~struts表单提交多行数据的问题~~ 100分解决STRUTS问题!关于ActionForward的 求个java算法 十个苹果 分给3个小孩 每人至少一个 苹果一样 有多少种分法 那里有tomcat下载 在数据库连接正常的情况下,使用 rs.last(); 为什么出现500错误?
使用现有的DLL的话,你可以自己建立DLL工程,在这个工程里边导入你的DLL,声明要这个工程里使用的该DLL的导出函数,同时把你JAVA中生成.h头文件导入,实现.h头文件中的导出函数,在这个导出函数里边,你就可以使用你本地DLL导入的函数。
是吗?我刚刚接触jni,项目又比较急,能给一些代码吗?
如果是直接JAVA调用自己写的包含JAVA标准导出函数的dll,网上例子很多调用其他dll 的我抽空给你写一个
JAVA调用JNITest这个含有JAVA标准导出格式的DLL,JNITest.dll又去调用一个非JAVA标准导出格式的DLL--MyTestJNI.dll,当然这个dll可以换成系统dll
-----------------------------------------------------------------------
JAVA 文件:
//MsgBox.java
package jnitest;
public class MsgBox
{
static{
System.loadLibrary("JNITest");
}
public native void showMsgBox(int n);
}//TestJNI.java
import jnitest.MsgBox;
public class TestJNI
{
public static void main(String[] args)
{
MsgBox box = new MsgBox();
box.showMsgBox(10);
}
}编译成功后, 运行
javah jnitest.MsgBox 生成 C头文件 jnitest_MsgBox.h //jnitest_MsgBox.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class jnitest_MsgBox */#ifndef _Included_jnitest_MsgBox
#define _Included_jnitest_MsgBox
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: jnitest_MsgBox
* Method: showMsgBox
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_jnitest_MsgBox_showMsgBox
(JNIEnv *, jobject, jint);#ifdef __cplusplus
}
#endif
#endif------------------------------------------------------------------------然后建立VC工程,准备生成MyTestJNI.dll
这里用一个最简单的计算函数示例吧,它求出一个整数的平方
//myFun.h
#ifndef __MYFUN_H_INCLUDE
#define __MYFUN_H_INCLUDE#ifdef __cplusplus
extern "C"
{
#endif //__cplusplus//示例函数,计算整数的平方__declspec(dllexport) int mySQRT(int n);#ifdef __cplusplus
}
#endif //__cplusplus#endif //__MYFUN_H_INCLUDE-----------------------------------------------------------------------// MyTestJNI.cpp : Defines the entry point for the DLL application.
//#include "stdafx.h"
#include "myFun.h"BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
__declspec(dllexport) int mySQRT(int n)
{
return n*n;
}编译生成MyTestJNI.dll和MyTestJNI.lib然后建立包含JAVA标准导出函数的DLL文件JNITest.dll
------------------------------------------------------------------------
把jnitest_MsgBox.h添加到自己的DLL工程中,同时把上步生成的MyTestJNI.dll和MyTestJNI.lib复制到当前工程Debug目录下,然后编辑JNITest.cpp:// JNITest.cpp : Defines the entry point for the DLL application.
//#include "stdafx.h"
#include "jnitest_MsgBox.h"//声明导出函数,底下导入MyTestJNI到此工程
extern "C" __declspec(dllexport) int mySQRT(int n);
#pragma comment(lib,"debug/MyTestJNI")BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
JNIEXPORT void JNICALL Java_jnitest_MsgBox_showMsgBox
(JNIEnv * env, jobject obj, jint n){
int m=(int)n;
int d=mySQRT(m); //调用该MyTestJNI.dll中的mySQRT函数
char* str=new char[20];
sprintf(str,"平方是 %d",d);
MessageBox(NULL,str,"Java 调用",MB_OK);
delete str;
}//////////////////////////////////////////////////////////
编译当前工程生成JNITest.dll至此,两个DLL均生成完毕,复制两个DLL文件到JAVA文件所在目录,运行
java TestJNI 是不是看到对话框,平方是100 OK,这只是个简单的例子,楼主可自行修改MyTestJNI DLL工程里的函数以实现一些底层操作。吃饭~~~
delete str ==> delete[] str;
...
JNIEXPORT void JNICALL Java_jnitest_MsgBox_showMsgBox
(JNIEnv * env, jobject obj, jint n){
int m=(int)n;
int d=mySQRT(m); //调用该MyTestJNI.dll中的mySQRT函数
char* str=new char[20];
sprintf(str,"平方是 %d",d);
MessageBox(NULL,str,"Java 调用",MB_OK);
//delete str;
delete[] str;
}
我做最后的dll时,
怎么提示“jni.h”文件找不到,
我已经把jdk下的jni.h copy到对应的目录了啊。急
例子也运行成功了。但是,现在又新的问题:
因为在生成dll的时候,有对应的.lib文件,所以,#pragma comment(lib,"debug/MyTestJNI")不会有问题.而我现在只有一个dll,和一个对应的ini文件.
如何vc++中引用没有lib的 dll.