当前位置: 技术问答>java相关
用个java的jni的和java高手们帮我看个问题:急急!!!!!!!!!!!!
来源: 互联网 发布时间:2015-08-11
本文导语: 我是用java调用vc的*.dll,步骤如下: 1,java原文件: import java.lang.*; import java.io.*; import java.util.*; public class NativeDemo { public static void main(String args[]) { String ls="aaaa"; ...
我是用java调用vc的*.dll,步骤如下:
1,java原文件:
import java.lang.*;
import java.io.*;
import java.util.*;
public class NativeDemo
{
public static void main(String args[])
{
String ls="aaaa";
NativeDemo ob = new NativeDemo();
int i=ob.JNGetFingerPrint(ls);
System.out.println("this is test:"+i);
}
public native int JNGetFingerPrint(String lpszFingerFile);
static
{
System.loadLibrary("Dllsam");
}
}
2,Dllsam.cpp文件如下:
include "stdAfx.h"
#include "atlconv.h"
#include "nativedemo.h"
#include
JNIEXPORT jint JNICALL Java_NativeDemo_JNGetFingerPrint
(JNIEnv *env, jobject jm, jstring js)
{
const char* msg=env->GetStringUTFChars(js,0);
typedef int(CALLBACK* LPFNDLLFUNC1)(LPCTSTR);
HINSTANCE hDLL; // Handle to DLL
LPFNDLLFUNC1 lpfnDllFunc1; // Function pointer
LPCTSTR ls= msg ;
//LPCTSTR lb=NULL;
int m;
hDLL = LoadLibrary("JNFP_YD");//调用动态库JNFP_YD,
if (hDLL != NULL)
{
lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,"JNGetFingerPrint");//调用动态库JNFP_YD的函数JNGetFingerPrint()
if (!lpfnDllFunc1)
{
FreeLibrary(hDLL);
return -2;
}
else
{
printf("this is test for JNGetFingerPint2");
m=lpfnDllFunc1(ls);
return m;
}
}
}
编译也没问题,可运行时候出现如下错误,这是那里的问题?
运行出现如下错误:
Debug Error!
Program : D:winntsystem32java.exe
Module:
File:i386chkesp.c
line:42
The value of ESP was not properly saved across a function call,this is usually a result of calling a function decalred
with one callilng convention with a function pointer declared with a different calling convention.
1,java原文件:
import java.lang.*;
import java.io.*;
import java.util.*;
public class NativeDemo
{
public static void main(String args[])
{
String ls="aaaa";
NativeDemo ob = new NativeDemo();
int i=ob.JNGetFingerPrint(ls);
System.out.println("this is test:"+i);
}
public native int JNGetFingerPrint(String lpszFingerFile);
static
{
System.loadLibrary("Dllsam");
}
}
2,Dllsam.cpp文件如下:
include "stdAfx.h"
#include "atlconv.h"
#include "nativedemo.h"
#include
JNIEXPORT jint JNICALL Java_NativeDemo_JNGetFingerPrint
(JNIEnv *env, jobject jm, jstring js)
{
const char* msg=env->GetStringUTFChars(js,0);
typedef int(CALLBACK* LPFNDLLFUNC1)(LPCTSTR);
HINSTANCE hDLL; // Handle to DLL
LPFNDLLFUNC1 lpfnDllFunc1; // Function pointer
LPCTSTR ls= msg ;
//LPCTSTR lb=NULL;
int m;
hDLL = LoadLibrary("JNFP_YD");//调用动态库JNFP_YD,
if (hDLL != NULL)
{
lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,"JNGetFingerPrint");//调用动态库JNFP_YD的函数JNGetFingerPrint()
if (!lpfnDllFunc1)
{
FreeLibrary(hDLL);
return -2;
}
else
{
printf("this is test for JNGetFingerPint2");
m=lpfnDllFunc1(ls);
return m;
}
}
}
编译也没问题,可运行时候出现如下错误,这是那里的问题?
运行出现如下错误:
Debug Error!
Program : D:winntsystem32java.exe
Module:
File:i386chkesp.c
line:42
The value of ESP was not properly saved across a function call,this is usually a result of calling a function decalred
with one callilng convention with a function pointer declared with a different calling convention.
|
c部分太过复杂难懂,本来还懂一些JNI,但是现在.....没办法帮你,
|
我试过了,完全正常.没有你所说的那个错误.你把ls的值"aaaa"传到C++中的const char* msg中,然后把msg赋给LPCTSTR类型的ls.在调用JNFP_YD中的方法JNGetFingerPrint()把ls参数传进去,返回的m值,没有什么大的问题啊.
|
那你有没有动态连接库的lib文件,如果有,就可以直接用调用API的形式调用了。
这和JNI没有太多关系,只是C的问题。你可以自己写C程序的时候测试通过了,然后再放到JNI中来,我们都基本上是这样做的,否则调试起来不是很方便。
这和JNI没有太多关系,只是C的问题。你可以自己写C程序的时候测试通过了,然后再放到JNI中来,我们都基本上是这样做的,否则调试起来不是很方便。