javah生成C++头文件(.h)

原创
2014/09/19 08:27
阅读数 662

在eclipse中建一项目,建一class,即TestHello.java文件

复制代码  

 1  package  esmart.colfile.parse
 3  public   class  TestHello {
 4       static  {
 5           System.loadLibrary( " TestHello " );
 6        }     
 8         public   static   native   void  hello(String msg);
10         public   static   void  main(String[] args) {         
12           hello( " Hello,Kimm! " );        
14        }
15   

复制代码   

  往往报如下的错误,就是因为shell命令的格式不对,应该严格按照我下面描述的格式来写,尤其注意第二步第三句的点和空格,就不会出错了。

 错误: 无法访问 esmart.colfile.parse.TestHello
       找不到文件 esmart.colfile.parse.TestHello.class
       javadoc: 错误 - 找不到类 esmart.colfile.parse.TestHello。
       Error: 未在命令行中指定任何类。请尝试使用 -help

打开cmd命令框,输入shell命令,按照如下顺序输入 :

   第一步:进入TestHello.java文件的上级目录,编译该文件,则能在G:\work\eclipse\test\bin\esmart\colfile\parse路径下生成一个TestHello.class文件,检查该文件的生成。

$ cd G:\work\eclipse\test\bin\esmart\colfile\parse
$ javac TestHello.java

   第二步:生成.h头文件(注意第三句易错,正确写法为:-classpath 空格 点 空格 -jni ……,少了空格或点都会报错)。

$ cd G:\work\eclipse\test\bin\esmart\colfile\parse
$ set classpath=G:\work\eclipse\test\bin
$ javah -classpath . -jni esmart.colfile.parse.TestHello

   这样则在G:\work\eclipse\test\bin路径下就生成了一个esmart_colfile_parse_TestHello.h 文件,代码如下所示。把这个头文件给c++项目引用,并实现其中的方法。可重命名esmart_colfile_parse_TestHello.h为TestHello.h即可。

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class org_tecunhuman_jni_TestHello */
#ifndef _Included_org_tecunhuman_jni_TestHello
#define _Included_org_tecunhuman_jni_TestHello
#ifdef __cplusplus
 
extern "C" {
#endif
/*
 * Class:     org_tecunhuman_jni_TestHello
 * Method:    hello
 * Signature: (Ljava/lang/String;)V
 */
  
JNIEXPORT void JNICALL Java_org_tecunhuman_jni_TestHello_hello
  (JNIEnv *, jclass, jstring); 
 
#ifdef __cplusplus
}
#endif
#endif

 VS2008中 工具 - 选项 - 项目和解决方案 - VC++目录 要增加 E:\tools\Java\jdk1.6.0_11\include\win32 和 E:\tools\Java\jdk1.6.0_11\include 具体目录根据本地JDK安装情况

eclipse 项目右键 properties 里面 设置 java build path 中的 native library location 到 VC项目的发布目录 

 VC中 

打开StdAfx.h文件,在最后面添加:

#include <jni.h>

#include "javah生成的.h"

cpp文件中实现 .h 中的方法

VC++项目现在基本都是UNICODE

复制代码

 1   JNIEXPORT   void   JNICALL Java_esmart_colfile_parse_TestHello_hello(JNIEnv   *   env, jclass obj, jstring jMsg , jint )
  2   {
  3       
  4            //  const char *strMsgPtr = env->GetStringUTFChars( jMsg , 0);     
  5     
  6            const   WCHAR   *  strMsgPtr   =   (WCHAR   *  )env  ->  GetStringChars(jMsg ,   0  );
  7   
  8          MessageBox(   0  , strMsgPtr,L  "  Message box from VC++   "    0   );
  9    
 10          env  ->  ReleaseStringChars(jMsg, (jchar   *  )strMsgPtr);
 11           //   env->ReleaseStringUTFChars( jMsg, strMsgPtr);   
 12      
 13   }

复制代码

展开阅读全文
打赏
1
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
1
分享
返回顶部
顶部