jni中的类型转换问题
用jni调用一个c程序,这个c程序的入口(main函数)需要两个参数--
(int argc, char **argv),这个char** argv需要怎么处理才能从java怎样传到c中?即在java中怎样声明这个函数,在c中怎样实现?
我想在java部分把函数声明为:
public native static void myTool(int argc,String[] argv);
不知道在c部分怎么实现这个函数?我对JNI及其函数不熟悉,
可以用GetObjectArrayElement(jobjectArray array, jsize index)解决这个问题吗?请指点一二。
我目前只知道处理单个字符串参数(如下面从网上copy的一段代码):
#include "zzzhc_net_Ping.h"
#include "ping.h"
JNIEXPORT jint JNICALL Java_zzzhc_net_Ping_pingCore
(JNIEnv *env, jclass jc, jstring host, jint timeout) {
const char *str = (*env)->GetStringUTFChars(env, host, 0);
int elapse = Ping(str,timeout);
(*env)->ReleaseStringUTFChars(env, host, str);
return elapse;
}
问题点数:30、回复次数:3Top
1 楼tgz501(长夜雨亭)回复于 2005-04-02 10:21:11 得分 5
up
关注Top
2 楼hdmykun(心铃儿动)回复于 2005-04-05 16:38:24 得分 15
jni调用c的话,c中不需要main()的。你把java方法生成c的头文件,就转换成了你在C下的格式,引用就可以了。给你个例子:
//java,DisplayMessage方法
public class DisplayMessage{
static{
System.loadLibrary("MessageHandler");
}
public static void main(String[] args){
printMessage();
}
/*printMessage()是要用的自然方法*/
public static native void printMessage();
}
命令javac -jni DisplayMessage.class
则生成头文件DisplayMessage.h,如下
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class DisplayMessage */
#ifndef _Included_DisplayMessage
#define _Included_DisplayMessage
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: DisplayMessage
* Method: printMessage
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_DisplayMessage_printMessage
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
你不要修改,但到中间的一句了吗?
——JNIEXPORT void JNICALL Java_DisplayMessage_printMessage
(JNIEnv *, jclass);
你拷下来粘到你要写得C程序中,只需要在()种的参数类型后给出变量名就可以,这就是jni要引用的C生成的库
#include <stdio.h>
#include "DisplayMessage.h"
JNIEXPORT void JNICALL Java_DisplayMessage_printMessage
(JNIEnv *env, jclass cl)
{
printf("Hello,Maggie!");
}
然后你就可以在Java下运行了,急得要指定库的路径
Top
3 楼junnef(启天)回复于 2005-04-13 10:43:16 得分 10
JNIEXPORT void JNICALL Java_MyNative_showStrings0
(JNIEnv *env, jclass cls, jobjectArray sa)
{
int len = (*env)->GetArrayLength( env, sa );
int i=0;
for( i=0; i < len; i++ )
{
jobject obj = (*env)->GetObjectArrayElement(env, sa, i);
jstring str = (jstring)obj;
const char* szStr = (*env)->GetStringUTFChars( env, str, 0 );
printf( "%s ", szStr );
(*env)->ReleaseStringUTFChars( env, str, szStr );
}
printf( "\n" );
}
char ** 不就是一个字符串数组么,就是这样传的,注意sa的用法就行了。Top




