高分求:用过jni的朋友帮我看看偶的程序错在哪?
高分求:用过jni的朋友帮我看看偶的程序错在哪?
#include <stdio.h>
#include "Java2DocdllAccess.h"
JNIEXPORT jlong JNICALL Java_Java2DocdllAccess_Init
(JNIEnv *env, jobject obj)
{
HINSTANCE hDll=LoadLibrary("Maker.dll");
Java_Java2DocdllAccess_Init pf =GetProcAddress(hDll,"Init");
return pf();
FreeLibrary(hDll);
}
JNIEXPORT jlong JNICALL Java_Java2DocdllAccess_New
(JNIEnv *env, jobject obj, jstring str1, jstring str2)
{
HINSTANCE hDll=LoadLibrary("Maker.dll");
Java_Java2DocdllAccess_New pf =GetProcAddress(hDll,"New");
return pf(str1,str2);
FreeLibrary(hDll);
}
说明:Maker.dll是一个c++的dll,由于偶只有这个dll,没有lib文件,所以偶只好在中间dll时,要调用它和它里面的函数,跪求用过的朋友帮看看,谢谢,正确一定给分!
问题点数:100、回复次数:10Top
1 楼solaris007()回复于 2005-02-04 08:40:06 得分 0
上面的程序是java2dll.c,偶老是编译不通过???Top
2 楼tabby(-_-b .. 内存泄漏)回复于 2005-02-04 08:45:28 得分 10
编译报什么错误??Top
3 楼GJA106(中文字符)回复于 2005-02-04 08:56:26 得分 35
楼主不好判断是什么错误,贴出编译异常。Top
4 楼mu_x(阿木)回复于 2005-02-04 08:59:13 得分 5
俺不会,占个座儿看看^_^Top
5 楼dvictor(大学之道 在明明德)回复于 2005-02-04 09:04:50 得分 5
关注Top
6 楼Jacky1206(胖胖,其实我不胖)回复于 2005-02-04 09:09:55 得分 20
贴出错误代码,是 UnSatisfiedLink ?只要你有编译好的 dll 就可以了,至于 lib 是编译生成 dll 时候要用的吧,和 jni 没有关系的,只要能编译成功 dll 就可以了Top
7 楼EverythingMaster(catch(LowSalaryException e){mySalary += 10000000;})回复于 2005-02-04 09:26:41 得分 5
学习中。。。。。
Top
8 楼solaris007()回复于 2005-02-04 10:59:26 得分 0
这是偶的全部代码
t.c
#include <stdio.h>
#include "Java2DocdllAccess.h"
int RunDllInit(char* fileName)
{
void (*MYPROC)(void);
HINSTANCE hlib;
int (*LOAD)(char* fileName);//定义函数指针
int retvalue; //函数返回
LOAD lpFunc;
hLib=LoadLibrary("Maker.dll");
if(hLib==NULL)
{
printf("exit load dll");
exit(-1);
}
AfxSetResourceHandle(hLib);
//调用name.dll的方法Abstract
lpFunc=(LOAD)GetProcAddress(hLib,"Init");
if(lpFunc==NULL)
{
printf("exit load fun");
exit(-1);
}
retvalue = (lpFunc)(fileName);
FreeLibrary(hLib);
return retvalue;
}
JNIEXPORT jlong JNICALL Java_Java2DocdllAccess_RunDllInit
(JNIEnv *env, jobject obj)
{
return RunDllInit();
}
int RunDllNewDoc(char* fileName)
{
void (*MYPROC)(void);
HINSTANCE hlib;
int (*LOAD)(char* fileName);//定义函数指针
int retvalue; //函数返回
LOAD lpFunc;
hLib=LoadLibrary("Maker.dll");
if(hLib==NULL)
{
printf("exit load dll");
exit(-1);
}
AfxSetResourceHandle(hLib);
//调用name.dll的方法Abstract
lpFunc=(LOAD)GetProcAddress(hLib,"NewDoc");
if(lpFunc==NULL)
{
printf("exit load fun");
exit(-1);
}
retvalue = (lpFunc)(fileName);
FreeLibrary(hLib);
return retvalue;
}
JNIEXPORT jlong JNICALL Java_Java2DocdllAccess_NewDoc
(JNIEnv *env, jobject obj, jstring str1, jstring str2)
{
return RunDllNewDoc(str1,str2);
}
Top
9 楼solaris007()回复于 2005-02-04 11:00:51 得分 0
这是用VC调试的结果
--------------------Configuration: t - Win32 Debug--------------------
Compiling...
t.c
c:\dll\t.c(7) : error C2065: 'HINSTANCE' : undeclared identifier
c:\dll\t.c(7) : error C2146: syntax error : missing ';' before identifier 'hlib'
c:\dll\t.c(7) : error C2065: 'hlib' : undeclared identifier
c:\dll\t.c(8) : error C2143: syntax error : missing ';' before 'type'
c:\dll\t.c(9) : error C2143: syntax error : missing ';' before 'type'
c:\dll\t.c(11) : error C2065: 'LOAD' : undeclared identifier
c:\dll\t.c(11) : error C2146: syntax error : missing ';' before identifier 'lpFunc'
c:\dll\t.c(11) : error C2065: 'lpFunc' : undeclared identifier
c:\dll\t.c(12) : error C2065: 'hLib' : undeclared identifier
c:\dll\t.c(12) : warning C4013: 'LoadLibrary' undefined; assuming extern returning int
c:\dll\t.c(13) : warning C4047: '==' : 'int ' differs in levels of indirection from 'void *'
c:\dll\t.c(16) : warning C4013: 'exit' undefined; assuming extern returning int
c:\dll\t.c(19) : warning C4013: 'AfxSetResourceHandle' undefined; assuming extern returning int
c:\dll\t.c(21) : error C2146: syntax error : missing ';' before identifier 'GetProcAddress'
c:\dll\t.c(21) : warning C4013: 'GetProcAddress' undefined; assuming extern returning int
c:\dll\t.c(22) : warning C4047: '==' : 'int ' differs in levels of indirection from 'void *'
c:\dll\t.c(28) : error C2065: 'retvalue' : undeclared identifier
c:\dll\t.c(28) : error C2064: term does not evaluate to a function
c:\dll\t.c(29) : warning C4013: 'FreeLibrary' undefined; assuming extern returning int
c:\dll\t.c(38) : error C2198: 'RunDllInit' : too few actual parameters
c:\dll\t.c(45) : error C2146: syntax error : missing ';' before identifier 'hlib'
c:\dll\t.c(46) : error C2143: syntax error : missing ';' before 'type'
c:\dll\t.c(47) : error C2143: syntax error : missing ';' before 'type'
c:\dll\t.c(49) : error C2146: syntax error : missing ';' before identifier 'lpFunc'
c:\dll\t.c(51) : warning C4047: '==' : 'int ' differs in levels of indirection from 'void *'
c:\dll\t.c(59) : error C2146: syntax error : missing ';' before identifier 'GetProcAddress'
c:\dll\t.c(60) : warning C4047: '==' : 'int ' differs in levels of indirection from 'void *'
c:\dll\t.c(66) : error C2064: term does not evaluate to a function
c:\dll\t.c(74) : warning C4133: 'function' : incompatible types - from 'struct _jobject *' to 'char *'
c:\dll\t.c(74) : warning C4020: 'RunDllNewDoc' : too many actual parameters
Error executing cl.exe.
t.obj - 19 error(s), 11 warning(s)
Top
10 楼Jacky1206(胖胖,其实我不胖)回复于 2005-02-04 17:24:32 得分 20
可能是 vc 配置路径的先后问题,查看一下.现在的问题是出在 vc 编译生成 dll 出错,而不是 java 的问题,对于 vc 编译时引入 lib 的路径,有时候先后的次序不同可能会造成编译出错,检查一下.另外看看语法是否有问题!Top




