`

使用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
 

 

 

 

 

分享到:
评论

相关推荐

    android NDK 自动生成jni头文件

    Android NDK 提供了一個工具 javah,可以将 Java 代码中的 JNI 方法转换为 C/C++ 头文件,以便进行 JNI 的 C/C++ 端程序的开发。 javah 命令是 Android NDK 中的一个重要工具,主要用于将 Java 代码中的 JNI 方法...

    java写的一个使用jni调用c/c++的dll

    接着,我们需要使用`javah`工具生成JNI头文件,这个头文件定义了Java `native`方法在C/C++中的原型。例如: ```java public class JniTest { public native void callCppFunction(); static { System....

    JNI DEMO:java jni技术 调用 c/c++ 的dll

    然后,使用`javah`工具,根据Java类生成相应的C/C++头文件。在C/C++代码中,我们会实现这些函数,它们将与DLL文件中的函数相对应。 接下来,我们需要创建一个C/C++源文件,包含之前由`javah`生成的头文件,并实现...

    Java 调用C/C++程序

    然后使用`javah`工具生成C/C++的头文件,这个头文件包含了Java native方法的C/C++声明。接着,开发者在C/C++环境中实现这个头文件中的方法,并编译为动态链接库(Windows上的DLL或Unix上的SO文件)。最后,Java程序...

    android调用C/C++

    总结来说,Android调用C/C++主要涉及JNI的使用,包括本地方法声明、头文件生成、C/C++代码编写、库编译、Java调用等多个步骤。通过这个过程,开发者可以充分利用C/C++的性能优势来优化应用程序的关键部分。如果在...

    java调用C/C++过程

    3. **生成JNI头文件**:使用JDK的`javah`工具,根据Java类生成对应的C/C++头文件和实现文件。例如: ```bash javah -jni HelloWorld ``` 这会产生一个`HelloWorld.h`文件,包含了`sayHello`方法的C/C++原型。 4. **...

    使用C/C++实现Java的Native方法接口(JNI)/ JNI编程(C/C++) 代码实例

    使用`javah`工具,根据Java类生成C/C++的头文件,这个文件包含了Java方法在C/C++中的原型: ``` javah -jni JNICBridge ``` 会生成`JNICBridge.h`,其中包含了`JNIEXPORT`和` JNICALL`等宏定义的函数原型。 5....

    使用JNI进行混合编程:在Java中调用C/C++本地库

    - 使用`javah`工具生成C/C++的头文件。在命令行中,输入 `javah -jni Sample1` 将根据Sample1.class生成Sample1.h。 2. **C/C++端的实现**: - 打开Sample1.h,可以看到Java方法签名已经转换成了C/C++函数原型。...

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

    `javah`工具可以从已编译的Java类中提取方法签名,生成对应的C/C++函数原型。 在`javah`命令中,有两种主要的选项可以生成不同的头文件:`-static`和非`-static`(默认)。这两个选项的主要区别在于如何处理Java...

    java调用C/C++的例子

    4. **编译JNI代码**:说明如何使用javah工具生成C/C++的头文件,以及如何使用C/C++编译器编译生成动态链接库(如.so或.dll文件)。 5. **加载库和调用函数**:解释如何在Java代码中加载动态链接库,并调用其中的方法...

    jni java调用c/c++

    在本例中,我们将详细介绍如何使用 JNI 将 Java 代码与 C/C++ 代码集成,生成动态库,并加载到 Java 程序中。 JNI 概述 JNI 提供了一种机制,允许 Java 代码调用 native 代码,反之亦然。JNI 提供了两种方式来实现...

    java怎么调用C语言

    使用`javah`工具可以自动生成C/C++头文件,这个头文件包含了与Java方法相对应的JNI函数原型。例如,`javah TestDLL`将生成`TestDLL.h`文件。 ##### 3. 编写C/C++实现 根据生成的头文件,我们可以在C/C++中实现这些...

    mac 下jni编译代码

    Java SDK包含了javah工具,这是生成C/C++头文件以供JNI使用的必要工具。你可以通过`java -version`命令检查Java是否已正确安装。 接下来,你需要一个C/C++的开发环境。对于Mac用户,Xcode是苹果提供的集成开发环境...

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

    `javah`工具就是Java SDK提供的一种命令行工具,用于生成C或C++的头文件,使得我们可以为Java类编写本地方法。然而,在实际操作中,我们可能会遇到一些常见错误。下面我们将详细讨论这些错误及其解决方法。 1. **...

    ndk源码基于eclipse开发c/c++/java

    - 使用`native`关键字声明方法,并使用`javah`命令生成对应的C/C++头文件。 - 在C/C++代码中实现这些方法,例如,`JNIEXPORT void JNICALL Java_package_class_method(JNIEnv *env, jobject obj)`。 6. **构建和...

    AndroidStudio 编译C/C++文件生成SO文件

    通过`javah`工具(在Android Studio中可以使用`Generate JNI Header`功能),我们可以自动生成对应的头文件,然后在C/C++代码中实现这些函数。 总结来说,Android Studio支持C/C++开发主要依赖于NDK,通过配置`...

    JNI创建java对象

    然后,使用javah工具生成对应的C/C++头文件,这个头文件包含了JNI函数的原型。对于上述Java类,将生成如下头文件: ```c /* DO NOT EDIT THIS FILE - it is machine generated */ #include /* Header for class ...

    JAVA如何调用dll:用JNI调用C或C++动态联接库原来如此简单

    使用`javah`工具(在JDK的bin目录下)生成C/C++的头文件。例如: ``` javah -jni NativeDemo ``` 这将生成`NativeDemo.h`,包含了Java方法到C/C++函数的映射。 4. **编写C/C++代码** 根据生成的头文件,编写C...

    JAVA调用C/C++ DLL文件方法

    编译该 JAVA 程序文件,生成 CLASS,再用 JAVAH 命令,JNI 就会生成 C/C++ 的头文件。例如程序 testdll.java,内容为: public class testdll { static {System.loadLibrary("goodluck");} public native static ...

Global site tag (gtag.js) - Google Analytics