首先我觉得你应该知道jni的基本使用步骤
我们调用本地方法是调用dll文件实现的,但是顺序只能是在java里面定义本地方法,然后编译,再用javah生成c或者c++的头文件,然后再根据头文件写相应的c和c++的方法。
再看看你的需求,我想只能通过自己再写一个dll来调用已有的那个dll至于类型转换,那很简单,java和c的基本数据类型都有对应转换
我们调用本地方法是调用dll文件实现的,但是顺序只能是在java里面定义本地方法,然后编译,再用javah生成c或者c++的头文件,然后再根据头文件写相应的c和c++的方法。
再看看你的需求,我想只能通过自己再写一个dll来调用已有的那个dll至于类型转换,那很简单,java和c的基本数据类型都有对应转换
我想确认的问题是:我要调用的c++的dll中函数的接口是这样定义的:
void Read(char* strPath, short* strKey)
我在java中声明本地接口的时候,函数的参数类型应该和C++中的相对应,我是象下面这样定义的,不知道对不对?
public native void Read(char Path[],short key[]);另外,我知道要生成一个jni的dll.在这个dll中的方法中,去调用C++中的接口,已经生成了java.h文件,现在根据头文件写c++的方法时候,(如果上面的声明方法对的话)
JNIEXPORT void JNICALL Java_qrcode_Code_Read
(JNIEnv *, jobject obj, jcharArray Path, jshortArray key)
{
//问题是我怎样将Path和Word进行数据类型转换,去调用C++中的Read方法呢?
Read(Path,Word)
}
Java C/C++
boolean[ ] JbooleanArray
byte[ ] JbyteArray
char[ ] JcharArray
short[ ] JshortArray
int[ ] JintArray
long[ ] JlongArray
float[ ] JfloatArray
double[ ] JdoubleArray
对于上述类型数组,有一组函数与其对应。以下函数中Xxx为对应类型。
xxx * GetXxxArrayElements(xxxArray array, jboolean *isCopy)
产生一个指向Java数组元素的C指针。不再需要时,需将此指针传给ReleaseXxxArrayElemes。参数:array 数组对象
isCopy 如果进行拷贝,指向以JNI_TRUE填充的jboolean,否则指向以JNI_FALSE填充的jboolean。
例如: jboolean * GetBooleanArrayElements(jbooleanArray array, jboolean *isCopy)
void ReleaseXxxArrayElements(xxxArray array,xxx *elems, jint mode)
通知虚拟机不再需要从GetXxxArrayElements得到的指针。参数:array 数组对象
elems 不再需要的指向数组元素的指针
mode 0=在更新数组元素后释放elems缓冲器
JNI_COMMIT=在更新数组元素后不释放elems缓冲器
JNI_ABORT=不更新数组元素释放elems缓冲器
例如:void ReleaseBooleanArrayElements(jbooleanArray array,jboolean *elems, jint mode)
xxxArray NewXxxArray(jsize len)
产生一个新的数组,通常在反值类型为数组型时用到参数:len 数组中元素的个数。
例如:jbooleanArray NewBooleanArray(jsize len)
public native void Read(char Path[],short key[]); =========java
void Read(char* strPath, short* strKey) ===================c++
JNIEXPORT void JNICALL Java_qrcode_Code_Read
(JNIEnv *, jobject obj, jcharArray Path, jshortArray key)
{
//问题是我怎样将Path和Word进行数据类型转换,去调用C++中的Read方法呢?
Read(Path,Word)
}
这样用肯定可以