我做了一个jni的练习,编译了两个dll,一个是供java调用符合java命名规范的useDll.dll,它会调用Dll1.dll,并接收Dll1.dll传来的字符串,将此字符串变为jstring后,返回给java类。但是当dll之间调用的时候出现了问题,
无法接收另一个dll的参数,代码如下:(小弟不懂c,只是永别人的代码稍加修改)
其中一个Dll1.dll会返回个字符串:
#include <stdio.h>
#include <windows.h>
char* retchar()
{
char * Buf_Return;
Buf_Return = (char*)malloc(1024);
Buf_Return="接收中文chinese!";
return Buf_Return;
}
另一个另一个调用这个dll:
#include <stdio.h>
#include <windows.h>
#include "stdlib.h"
#include "string.h"
#include "testDll.h"char* jstringToWindows( JNIEnv *env, jstring jstr );
jstring WindowsTojstring( JNIEnv* env, char* str );JNIEXPORT jstring JNICALL Java_testDll_sayHello
(JNIEnv * env, jobject obj, jstring s)
{
HINSTANCE hinstLib;
const char * str;
char * Buf_Return;
char * ProcAdd;
hinstLib = LoadLibrary("Dll1");
ProcAdd = (char*)GetProcAddress(hinstLib, "retchar");//(1)
//ProcAdd ="接收到字符串";//(2)
Buf_Return = (char*)malloc(1024);
str= env->GetStringUTFChars(s, 0);
printf("%s",str);
env->ReleaseStringUTFChars(s, str);
const char * recvtest = jstringToWindows( env, s );
sprintf(Buf_Return,ProcAdd);
s = WindowsTojstring(env ,Buf_Return);
return s;
}......
当用(2)时java可以显示="接收到字符串"
用(1)时就不行,报错说“debug assertion failed!program c:\porgram files\java\jdk1.5.0_04\bin\javaw.exe File :sprintf.c Line 94 Expression:format!=null for information on how your program can cause an assertion failure ,see the visual c++ documentation on asserts“
希望各位指教!
无法接收另一个dll的参数,代码如下:(小弟不懂c,只是永别人的代码稍加修改)
其中一个Dll1.dll会返回个字符串:
#include <stdio.h>
#include <windows.h>
char* retchar()
{
char * Buf_Return;
Buf_Return = (char*)malloc(1024);
Buf_Return="接收中文chinese!";
return Buf_Return;
}
另一个另一个调用这个dll:
#include <stdio.h>
#include <windows.h>
#include "stdlib.h"
#include "string.h"
#include "testDll.h"char* jstringToWindows( JNIEnv *env, jstring jstr );
jstring WindowsTojstring( JNIEnv* env, char* str );JNIEXPORT jstring JNICALL Java_testDll_sayHello
(JNIEnv * env, jobject obj, jstring s)
{
HINSTANCE hinstLib;
const char * str;
char * Buf_Return;
char * ProcAdd;
hinstLib = LoadLibrary("Dll1");
ProcAdd = (char*)GetProcAddress(hinstLib, "retchar");//(1)
//ProcAdd ="接收到字符串";//(2)
Buf_Return = (char*)malloc(1024);
str= env->GetStringUTFChars(s, 0);
printf("%s",str);
env->ReleaseStringUTFChars(s, str);
const char * recvtest = jstringToWindows( env, s );
sprintf(Buf_Return,ProcAdd);
s = WindowsTojstring(env ,Buf_Return);
return s;
}......
当用(2)时java可以显示="接收到字符串"
用(1)时就不行,报错说“debug assertion failed!program c:\porgram files\java\jdk1.5.0_04\bin\javaw.exe File :sprintf.c Line 94 Expression:format!=null for information on how your program can cause an assertion failure ,see the visual c++ documentation on asserts“
希望各位指教!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货