本文主要是介绍JAVA调用DLL的两种方法-ZPL中文打印(作者不详,如有冒犯,请联系我),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
JAVA调用DLL的两种方法
(2008-03-05 17:24:48)
标签: it |
public class TestNative
{
private native static int Max(int a,intb);
private native static StringgetStr();
public static voidmain(String[] args)
{
System.out.println(Max(2,100));
System.out.println(getStr());
}
static
{
System.loadLibrary("VCdll");
}
}
#include "TestNative.h"
#include "stdlib.h"
#include "string.h"
#include "windows.h"
char* jstringToWindows( JNIEnv *env, jstring jstr );
jstring WindowsTojstring( JNIEnv* env, char* str );
JNIEXPORT jint JNICALL Java_TestNative_Max
(JNIEnv * a, jclass b, jint x, jint y)
{
typedef int (CALLBACK*LPFNDLLFUNC1)(char*,char*,char*,int,int,int,int,int,char*);
LPFNDLLFUNC1 fun;
HINSTANCE hDLL=::LoadLibrary("Fnthex32.dll");
fun=(LPFNDLLFUNC1)GetProcAddress(hDLL,"GETFONTHEX");
FreeLibrary(hDLL);
//return x > y ? x : y;
return 123;
}
JNIEXPORT jstring JNICALL Java_TestNative_getStr
(JNIEnv * a, jclass b)
{
char * Buf_Return;
Buf_Return = (char*)malloc(1024);
Buf_Return = "顶你个肺";
jstring str = WindowsTojstring(a,Buf_Return);
return str;
}
char* jstringToWindows( JNIEnv *env, jstringjstr )
{
int length =(env)->GetStringLength(jstr);
const jchar* jcstr =(env)->GetStringChars(jstr,0);
char* rtn = (char*)malloc( length*2+1 );
int size = 0;
size = WideCharToMultiByte( CP_ACP, 0,(LPCWSTR)jcstr, length, rtn,(length*2+1), NULL, NULL );
if( size <= 0 )
returnNULL;
(env)->ReleaseStringChars(jstr, jcstr);
rtn[size] = 0;
return rtn;
}
jstring WindowsTojstring( JNIEnv* env, char* str )
{
jstring rtn = 0;
int slen = strlen(str);
unsigned short * buffer = 0;
if( slen == 0 )
rtn =(env)->NewStringUTF(str);
else
{
int length =MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0 );
buffer =(unsigned short *)malloc( length*2 + 1 );
if(MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer,length ) >0 )
rtn = (env)->NewString( (jchar*)buffer, length);
}
if( buffer )
free( buffer );
return rtn;
}
方法二,使用JNative:
importjava.io.File;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importorg.xvolks.jnative.JNative;
importorg.xvolks.jnative.Type;
import org.xvolks.jnative.exceptions.NativeException;
import org.xvolks.jnative.pointers.Pointer;
import org.xvolks.jnative.pointers.memory.*;
public class TestJNative
{
public static void main(String arsp[]) throwsException
{
JNative n = newJNative("Fnthex32.dll","GETFONTHEX");
n.setRetVal(Type.INT);
n.setParameter(0,Type.STRING,"中文");
n.setParameter(1,Type.STRING,"宋体");
n.setParameter(2,Type.INT,"0");
n.setParameter(3,Type.INT,"14");
n.setParameter(4,Type.INT,"0");
n.setParameter(5,Type.INT,"1");
n.setParameter(6,Type.INT,"0");
Pointer p2= new Pointer( new HeapMemoryBlock(22*1024));
p2.setMemory(newbyte[21*1024]);
n.setParameter(7,p2);
n.invoke();
System.out.println(p2.getAsString());
}
}
这篇关于JAVA调用DLL的两种方法-ZPL中文打印(作者不详,如有冒犯,请联系我)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!