文档章节

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

刘小米_思聪
 刘小米_思聪
发布于 2014/09/19 08:27
字数 590
阅读 207
收藏 0

在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   }

复制代码

© 著作权归作者所有

刘小米_思聪
粉丝 58
博文 60
码字总数 43955
作品 0
西安
其他
私信 提问
cygwin + gcc+makeFile入门(三): JNI的编译

不想花大力气介绍JNI,所以这部分需要你自己去查阅入门资料: 1. 写包含Native方法的Java类 2. 编译上述java类,并通过javah生成.h头文件 3. 根据头文件写CPP 4. 编译.h + .cpp文件 首先学习一...

晨曦之光
2012/03/09
569
0
Java中JNI的使用详解第一篇:HelloWorld

今天开始研究JNI技术,首先还是老套路,输出一个HelloWorld:具体流程如下:在Java中定义一个方法,在C++中实现这个方法,在方法内部输出“Hello World",然后再回到Java中进行调用。分为以下步...

zhangyujsj
2015/08/23
34
0
android JNI 开发之第一个 JNI 实例

本文旨在一步一步记录一个 JNI 实例的诞生过程及在这个过程中我遇到的坑 & 解决方案。作为一个以前没有接触过 JNI 开发的新手,以下步骤中很多内容都看不懂,所以也不打算在本文中详细介绍,...

天王盖地虎626
01/22
3
0
jni c++ dll java

java通过jni 来调用.dll(在linux中称为.so文件) c++->.dll (windows) c++->.so (linux) 所以加载时,只要指定名就行了. 开发步骤; /* * 1.建立java工程编写带有native声明的方法的java类 ...

~小白
2012/03/28
223
0
android开发教程(3)— jni编程之采用SWIG从Java调用C/C++

Android 从Java调用C/C++ 当无法用 Java 语言编写整个应用程序时,JNI 允许您调用C/C++本机代码。在下列典型情况下,您可能决定使用本机代码: 希望用更低级、更快的编程语言C/C++去实现对时...

刘小米_思聪
2014/09/16
4.6K
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
1K
12
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
27
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
23
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
40
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部