CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2SE / 基础类

jni中的类型转换问题

楼主flyboat(boat)2005-04-02 00:48:06 在 Java / J2SE / 基础类 提问

用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

相关问题

  • JNI类型转换问题?
  • JSP中的类型转换?
  • VC中的类型转换?
  • C#中的类型转换
  • Python中类型转换
  • 类型转换!
  • 类型转换???
  • 类型转换????
  • 类型转换????
  • 转换类型

关键词

  • 函数
  • java
  • sa
  • displaymessage
  • printmessage
  • env
  • jni
  • jclass
  • jniexport
  • jnienv

得分解答快速导航

  • 帖主:flyboat
  • tgz501
  • hdmykun
  • junnef

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo