使用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 提供了一個工具 javah,可以将 Java 代码中的 JNI 方法转换为 C/C++ 头文件,以便进行 JNI 的 C/C++ 端程序的开发。 javah 命令是 Android NDK 中的一个重要工具,主要用于将 Java 代码中的 JNI 方法...
接着,我们需要使用`javah`工具生成JNI头文件,这个头文件定义了Java `native`方法在C/C++中的原型。例如: ```java public class JniTest { public native void callCppFunction(); static { System....
然后,使用`javah`工具,根据Java类生成相应的C/C++头文件。在C/C++代码中,我们会实现这些函数,它们将与DLL文件中的函数相对应。 接下来,我们需要创建一个C/C++源文件,包含之前由`javah`生成的头文件,并实现...
然后使用`javah`工具生成C/C++的头文件,这个头文件包含了Java native方法的C/C++声明。接着,开发者在C/C++环境中实现这个头文件中的方法,并编译为动态链接库(Windows上的DLL或Unix上的SO文件)。最后,Java程序...
总结来说,Android调用C/C++主要涉及JNI的使用,包括本地方法声明、头文件生成、C/C++代码编写、库编译、Java调用等多个步骤。通过这个过程,开发者可以充分利用C/C++的性能优势来优化应用程序的关键部分。如果在...
3. **生成JNI头文件**:使用JDK的`javah`工具,根据Java类生成对应的C/C++头文件和实现文件。例如: ```bash javah -jni HelloWorld ``` 这会产生一个`HelloWorld.h`文件,包含了`sayHello`方法的C/C++原型。 4. **...
使用`javah`工具,根据Java类生成C/C++的头文件,这个文件包含了Java方法在C/C++中的原型: ``` javah -jni JNICBridge ``` 会生成`JNICBridge.h`,其中包含了`JNIEXPORT`和` JNICALL`等宏定义的函数原型。 5....
- 使用`javah`工具生成C/C++的头文件。在命令行中,输入 `javah -jni Sample1` 将根据Sample1.class生成Sample1.h。 2. **C/C++端的实现**: - 打开Sample1.h,可以看到Java方法签名已经转换成了C/C++函数原型。...
`javah`工具可以从已编译的Java类中提取方法签名,生成对应的C/C++函数原型。 在`javah`命令中,有两种主要的选项可以生成不同的头文件:`-static`和非`-static`(默认)。这两个选项的主要区别在于如何处理Java...
4. **编译JNI代码**:说明如何使用javah工具生成C/C++的头文件,以及如何使用C/C++编译器编译生成动态链接库(如.so或.dll文件)。 5. **加载库和调用函数**:解释如何在Java代码中加载动态链接库,并调用其中的方法...
在本例中,我们将详细介绍如何使用 JNI 将 Java 代码与 C/C++ 代码集成,生成动态库,并加载到 Java 程序中。 JNI 概述 JNI 提供了一种机制,允许 Java 代码调用 native 代码,反之亦然。JNI 提供了两种方式来实现...
使用`javah`工具可以自动生成C/C++头文件,这个头文件包含了与Java方法相对应的JNI函数原型。例如,`javah TestDLL`将生成`TestDLL.h`文件。 ##### 3. 编写C/C++实现 根据生成的头文件,我们可以在C/C++中实现这些...
Java SDK包含了javah工具,这是生成C/C++头文件以供JNI使用的必要工具。你可以通过`java -version`命令检查Java是否已正确安装。 接下来,你需要一个C/C++的开发环境。对于Mac用户,Xcode是苹果提供的集成开发环境...
`javah`工具就是Java SDK提供的一种命令行工具,用于生成C或C++的头文件,使得我们可以为Java类编写本地方法。然而,在实际操作中,我们可能会遇到一些常见错误。下面我们将详细讨论这些错误及其解决方法。 1. **...
- 使用`native`关键字声明方法,并使用`javah`命令生成对应的C/C++头文件。 - 在C/C++代码中实现这些方法,例如,`JNIEXPORT void JNICALL Java_package_class_method(JNIEnv *env, jobject obj)`。 6. **构建和...
通过`javah`工具(在Android Studio中可以使用`Generate JNI Header`功能),我们可以自动生成对应的头文件,然后在C/C++代码中实现这些函数。 总结来说,Android Studio支持C/C++开发主要依赖于NDK,通过配置`...
然后,使用javah工具生成对应的C/C++头文件,这个头文件包含了JNI函数的原型。对于上述Java类,将生成如下头文件: ```c /* DO NOT EDIT THIS FILE - it is machine generated */ #include /* Header for class ...
使用`javah`工具(在JDK的bin目录下)生成C/C++的头文件。例如: ``` javah -jni NativeDemo ``` 这将生成`NativeDemo.h`,包含了Java方法到C/C++函数的映射。 4. **编写C/C++代码** 根据生成的头文件,编写C...
编译该 JAVA 程序文件,生成 CLASS,再用 JAVAH 命令,JNI 就会生成 C/C++ 的头文件。例如程序 testdll.java,内容为: public class testdll { static {System.loadLibrary("goodluck");} public native static ...