jni使用c++写的一个dll中的函数时,函数入口的结构指针应该怎么处理?(50分)

  • 主题发起人 主题发起人 charlyisme
  • 开始时间 开始时间
C

charlyisme

Unregistered / Unconfirmed
GUEST, unregistred user!
jni使用c++写的一个dll中的函数时,函数入口的结构指针应该怎么处理?
目前需要利用jni使用dll/so中的一个c++写的函数,这个函数的入口是一个
结构(struct)指针,按照JNI帮助中一步步实现时,发现无法找到java中对应的
结构类型,具体写的时候应该怎么处理呢?能否举个例子?
(如果可以映射成类,但具体怎么写这个类)
请教各位朋友!
 
这里有个简单的例子 希望对你有所帮助
#include <jni.h>
#include "WinCAClass.h"
#include <stdio.h>
#include <windows.h>

HINSTANCE SafeEngineJava;
JNIEXPORT void JNICALL Java_WinCAClass_SE_1LoadLibrary
(JNIEnv *, jobject)
{
SafeEngineJava=LoadLibrary("SafeEngine.dll");
}
JNIEXPORT void JNICALL Java_WinCAClass_SE_1FreeLibrary
(JNIEnv *, jobject)
{
FreeLibrary(SafeEngineJava);
}
JNIEXPORT jlong JNICALL Java_WinCAClass_SE_1InitialSession
(JNIEnv *env, jobject, jlong x, jstring y, jstring z, jlong o, jlong p, jstring q, jstring r)
{
typedef long (* _SE_InitialSession)(unsigned long privatekeydevicetype,
char *privatekeydeviceparameter, char *privatekeypassword, unsigned long privatekeytimeout,
unsigned long certchaindevicetype, char *certchaindeviceparameter, char *certchainpassword );

_SE_InitialSession SE_InitialSession;
long returnValue;
////////////
char *str = (char *)env->GetStringUTFChars(y, JNI_FALSE );
char *str1 = (char *)env->GetStringUTFChars(z, JNI_FALSE );
char *str2 = (char *)env->GetStringUTFChars(q, JNI_FALSE );

char *str3 = (char *)env->GetStringUTFChars(r, JNI_FALSE );

////////////
SE_InitialSession=(_SE_InitialSession)GetProcAddress(SafeEngineJava,"SE_InitialSession");
returnValue= (*SE_InitialSession)((unsigned long)x,str,str1,(unsigned long)o,(unsigned long)p,str2,str3);
return returnValue;
}
 
谢谢7syw。
看不懂,呵呵,有没有说明之类的东西呀
另外,JAVA部分是怎么写的?
 
public class WinCAClass {
private static final String SILIB = "SafeEngineJava";
static {
try {
System.loadLibrary (SILIB);
}
catch (UnsatisfiedLinkError e)
{ System.out.println ("native lib '" + SILIB + "' not found in 'java.library.path': ");
System.out.println( System.getProperty ("java.library.path"));
}
}
public native long SE_InitialSession( long privatekeydevicetype, String privatekeydeviceparameter,
String privatekeypassword,long privatekeytimeout, long rootcertdevicetype,
String rootcertdeviceparameter,String rootcertpassword);
}
用javah 生成 C的头文件 然后 在根据头文件来写DLL的代码
网上有很多相关的范例
 
后退
顶部