`

使用Javah 生成C/C++头文件的误区

 
阅读更多

使用Javah 可以获取您的 Java 源文件并生成 C/C++头文件,其中包含您的 Java 代码中所有本地方法(native方法)的 JNI 存根(stub,C头文件)。如果您正在生成一个类的 JNI 存根,而且您已经把这个类定义为包的一部分,那么您 必须指定完全限定的类名。

下面举例说明:

使用eclipse建立一个工程假设工程路径为$ProjectPath,并且你已经定义了一个类,并且带包名:cn.com.comit.jni

----------------------------

package cn.com.comit.jni;

public class HelloJni {
	
	public native void displayHelloJni();
	static{
		System.loadLibrary("");
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new HelloJni().displayHelloJni();
	}

}

 

----------------------------

eclipse会自动帮你编译出一个字节码文件HelloJni.class,路径是$ProjectPath\bin\cn\com\comit\jni,很可能你会先cd到.class的目录这么做:

>cd $ProjectPath\bin\cn\com\comit\jni

>$ProjectPath\bin javah HelloJni

发现执行出错:

错误:无法访问 HelloJni
错误的类文件: .\HelloJni.class
类文件包含错误的类: cn.com.comit.jni.HelloJni
请删除该文件或确保该文件位于正确的类路径子目录中。

看来是路径有问题咯。那改成

javah cn.com.comit.jni.HelloJni

再次运行,发现还是错误:

错误:无法访问 cn.com.comit.jni.HelloJni
未找到 cn.com.comit.jni.HelloJni 的类文件
javadoc: 错误 - 找不到类 cn.com.comit.jni.HelloJni。

 

怎么才能解决这个问题呢?其实只要cd到包的上一级目录(我们这里是$ProjectPath\bin)在运行下面的命令就搞定了:

javah -classpath . cn.com.comit.jni.HelloJni

看一下生成的C头文件:

 

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class cn_com_comit_jni_HelloJni */

//避免重复包含头文件
#ifndef _Included_cn_com_comit_jni_HelloJni 
#define _Included_cn_com_comit_jni_HelloJni
//c++编译环境中才会定义__cplusplus (plus就是"+"的意思
#ifdef __cplusplus 
extern "C" {  //告诉编译器下面的函数是c语言函数(因为c++和c语言对函数的编译转换不一样,主要是c++中存在重载)
#endif
/*
 * Class:     cn_com_comit_jni_HelloJni
 * Method:    displayHelloJni
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_cn_com_comit_jni_HelloJni_displayHelloJni
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
 

 

 

 

 

分享到:
评论

相关推荐

    javah命令生成的头文件

    javah命令生成的后缀是.h的c语言的头文件,

    JNI开发之javah生成静态和非静态的两个头文件区别代码

    JNI开发之javah生成静态和非静态的两个头文件区别

    JNI技术手册 c/c++调用java

    三、 编写 C/C++ 代码 13 四、 运行exe 18 IV. Java JNI 编程进阶 18 一、 解决性能问题 18 二、 解决本机平台接口调用问题 19 三、 嵌入式开发应用(JNI小例子) 20 1、 新增一个基础类 22 2、 定义新类继承基础类 23...

    scalatags_2.10-0.1.2.zip

    jni-headers-maven-plugin.zip,用于生成从Java调用的本地函数的C/C++头文件的Maven插件(使用Javah)

    用javah导出类的头文件常见的错误及正确的使用方法.docx

    用javah导出类的头文件常见的错误及正确的使用方法.docx

    ndk开发实战javap签名篇

    ndk开发者对于javah和javap必用的,是否无法获取到签名,是否无法根据java代码生成c/c++中的头文件呢,那么就下载这个能指导你倒争取的方向

    JNI中文翻译

    ·编写带有native声明的方法的java类 ·使用javac命令编译所编写的java类 ·使用javah ?jni java类名生成扩展名为h的头文件 ...·使用C/C++实现本地方法 ·将C/C++编写的文件生成动态连接库 ·ok

    Android使用jni调用c++/c方法详解

    1、下载ndk 2、编写jni的加载类 参考例子: public class JniTest { ...3、使用javah -jni生成.h文件 编写好jni加载类之后,就要开始生成.h文件了,此文件相当于一个声明文件,起到jni连接c++源

    jni-example.zip

    执行之后会生成一个com_example_jni_example_MainActivity.h 的C头文件; 4、将上面生成的头文件拷贝到jni目录下,并实现该头文件里面的函数;上面自动生成的头文件中不含有参数,需要自己补齐。 5、完善工程目录...

    Android JNI实例

    ②编写c/c++文件,实现之前头文件中所定义的的函数。 ③编写Android.mk(自定义要编译的文件、标签等)和Application.mk(编译的架构)文件。 注意: ①编译之前要配置好NDK环境变量。 ②要在c文件中注册本地方法。

    JNI调用大全

    Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 Chap 3:javah命令帮助信息......Chap 4:用javah产生一个...Chap5:使用JNI技术实现java程序调用第三方dll(c/c++)文件的功能... 47 Chap9:如何编写jni方法(转载)... 55

    JAVA JNI C++调用示例

    利用JAVAH生成C++的JNI类,使用JAR打包生成可执行包

    JNI文档资料源码_2020_01_22

    使用 javah 工具生成 C++ 中需要实现的 Native 方法 ( 仅做参考 ) X . 总结 ———————————————— 版权声明:本文为CSDN博主「韩曙亮」的原创文章,遵循 CC 4.0 BY-NC-SA 版权协议,转载请附上原文...

    JNI应用实例(java、C++互调)

    实例1: 1)使用javah 生成.h文件 2)根据.h文件,编写.cpp源程序。 实例2: 1)演示了java调用c++,以及c++调用java。 2)java 与 c++ 间,通过复杂数据类型(Vector)作为参数来传递数据。

    JNI完全技术手册 带完整书签

    Chap5:使用JNI技术实现java程序调用第三方dll(c/c++)文件的功能... 47 Chap9:如何编写jni方法(转载)... 55 1、实例一:在jni中调用标准c中自带的函数printf(): 57 2、实例二、调用c 语言用户定义的函数... 58 ...

    luajava1.1 中的头文件 luajava.h

    从 https://nodeload.github.com/jasonsantos/luajava/zipball/master 下载的 luajava 中是没有 luajava.h 文件的 该文件需要由 JDK 的 javah 生成 在此希望能帮到一些生成luajava.h因难的人 :)

    Android 串口 文件描述符

    使用Java的FileDescriptor来操作...②使用javac将.java编译成.class文件,然后使用javah编译相应的头文件 ③实现相关的.c/.cpp文件(实现头文件中定义的函数) ④编写Android.mk和Aplication.mk文件 ⑤利用ndk编译so库。

    javah h h h guu

    ewrwrtwtwetwetwtwtwetwetwfdsfsdfs ydrrydghdfhd[ fsddgsdg

    JNI之Hello-JNI进阶

    4. 利用命令生成相应的头文件,在根目录下执行:javah -classpath bin/classes -d jni com.xxx.hello.HelloJni ————————————— ——————— ^ ^ 包名 类名 5. 编写相应的.c文件(hello-jni.c) #...

    Android_JNI_Helloworld:Android Studio的安装项目以使用NDK

    使用javah生成C ++头 cd projectPath / app / src / main javah -d jni -cp pathTo / Library / Android / sdk / platforms / android-22 / android.jar:../../ build / intermediates / classes /

Global site tag (gtag.js) - Google Analytics