[size=-large]
方法步骤:
1.在java类中声明一个本地方法。
2.运行javah以获取包含该方法的c声明的头文件
3.用c实现该方法
4.将代码置于共享类库中。
5.在java程序中加载该库
详细实例:
系统:ubuntu 11.04/64bit
1.注意native关键字
HelloNative.java
class HelloNative {
public static native void greeting();
}
2.编译这个java源文件
javac HelloNative.java
生成
HelloNative.class
3.用javah 生成c函数的头文件,你也可以自己按照sun定义的标准写,还是自动生成简单些。
javah HelloNative
生成 HelloNative.h
内容如下
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloNative */
#ifndef _Included_HelloNative
#define _Included_HelloNative
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloNative
* Method: greeting
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloNative_greeting
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
这个要真的去手写,出错的几率很大。
4.接下来就是函数的实现了,这个要自己动手编写
HelloNative.c
#include "HelloNative.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloNative_greeting
(JNIEnv * env, jclass cl) {
printf("Hello Native World!\n");
}
事例只是向控制台打印一句 Hello Native World!
5.用gcc编译该源文件,在控制台中cd 到源文件的文件夹下
cd ~/code/android_demo/jni
gcc -fPIC -I JAVA_HOME/include -I JAVA_HOME/include/linux -shared -o libHelloNative.so HelloNative.c
运行时将JAVA_HOME替换为本地jdk的根目录,我的是/usr/lib/jvm/java/jdk1.6.0_23
正常运行后会生成以.so结尾的动态链接库文件,名为libHelloNative.so
6.编写java程序加载动态库文件
HelloWorldTest.java
class HelloWorldTest {
public static void main(String[] args) {
HelloNative.greeting();
}
static {
System.loadLibrary("HelloNative");
}
}
7.编译运行HelloWorldTest.java
命令:
javac HelloWorldTest.java
生成 HelloWorldTest.class
这时如果你直接运行会报
错误如下
Exception in thread "main" java.lang.UnsatisfiedLinkError: no HelloNative in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1734)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
at java.lang.System.loadLibrary(System.java:1028)
at HelloWorldTest.<clinit>(HelloWorldTest.java:7)
Could not find the main class: HelloWorldTest. Program will exit.
主要是这个错误引起:java.lang.UnsatisfiedLinkError: no HelloNative in java.library.path,意思是找不到load的动态链接库,这是一定,系统默认就是那几个指定的lib文件夹下,自己写的就要加进去才能被jvm找到,可以在运行的时候指定当前目录作为动态库位置进行加载
java -Djava.library.path=. HelloWorldTest
这样就正常了。
输出: Hello Native World!
恩,java已经很完没了,不是在然和时候jni都适合。
下面是我练习时的源码,有兴趣一起研究。
[/size][/size]
分享到:
相关推荐
1. **JNI概述**:JNI是一个接口,提供了一套API,使得Java开发者可以编写本地方法来调用非Java代码,通常是C/C++,用于利用硬件特性或优化性能。这种调用方式在处理底层系统操作、图形加速、设备驱动等方面非常有用...
JNI(Java Native Interface)是Java平台提供的一种标准接口,它允许Java代码和其他语言写的代码进行交互。...理解并熟练运用JNI,可以极大地扩展Java应用程序的功能,但同时也需要对C/C++和Java两套API有深入的理解。
它包含了一系列的头文件和库,使得Java代码能够通过JNI接口调用C/C++代码,同时也提供了交叉编译器,将C/C++源码编译为适用于不同Android架构的机器码。 2. JNI原理: JNI接口定义了一套标准的C/C++函数,这些函数...
5. **调用DLL函数**:在Java中通过JNI接口调用DLL中的函数,实现热键屏蔽和任务栏隐藏功能。 在开发过程中,需要注意的是,由于涉及到操作系统级别的操作,可能需要管理员权限运行Java程序,且不恰当的使用可能会对...
### JNI接口开发详解 #### 一、Java调用Native方法的基本流程 JNI(Java Native Interface)作为Java平台的一部分,提供了一种机制使得Java代码能够调用C/C++编写的本地方法,反之亦然。这对于利用现有C/C++库或者...
- JNI接口定义了一套规范,让Java代码能够声明本地方法,这些方法由非Java代码实现。 - 在Java中,本地方法通过`native`关键字声明,并使用`System.loadLibrary`或`Class.forName`.`getMethodID`等方法加载动态...
它定义了一组接口和数据类型,使得Java虚拟机(JVM)能够加载和调用本地方法。在Android中,JNI主要用来实现性能敏感的代码或利用已有的C/C++库。 2. **创建JNI项目结构** 创建一个Android项目时,需要在`src/main...
- JNI是一种接口,让Java应用程序能够调用本地(非Java)代码,同时也允许本地代码调用Java方法。 - 在Android中,JNI通常用于实现Java与C/C++之间的数据交换,提高性能,或者利用现有的C/C++库。 2. **创建JNI...
JNI提供了一组接口和函数,让Java程序可以调用本地(非Java)代码,同时也能让本地代码调用Java对象和方法。在Java中,本地方法是用`native`关键字声明的,但具体的实现是在C或C++中完成的。这个过程涉及到以下几个...
- 创建一个Java类,通常带有`native`关键字声明的方法,表示这个方法将通过JNI调用本地代码。 - 使用`javah`工具,基于Java类生成C语言的头文件,头文件定义了Java native方法对应的C函数原型。 2. **C端的实现**...
JNI(Java Native Interface)是Java平台的标准组成部分,它允许Java代码和其他语言写的代码...理解并熟练运用JNI接口,能够帮助开发者充分利用两种语言的优点,提高代码的执行效率,同时保持代码的清晰和可维护性。
6. **调用本地方法**:现在可以在Java程序中通过之前定义的接口调用本地方法了。 ```java NativeScanner scanner = NativeScanner.newInstance(); scanner.scanDocument("/path/to/document"); ``` 7. **错误...
通过"MyJni"这个案例,开发者可以学习如何在Android应用中有效地运用JNI技术,理解Java和C/C++代码之间的交互过程,从而提升应用的性能和功能。实践中,需要注意内存管理、异常处理和多线程同步等问题,以确保代码的...
4. **动态链接**:Java虚拟机在运行时加载动态链接库(DLL或SO),使Java代码能够调用本地方法。 接下来,我们来看看本地方法栈。本地方法栈是JVM的五个主要组成部分之一,与Java虚拟机栈类似,但它专门为执行本地...
- 调用本地方法。 4. 示例代码 - Java代码示例: ```java public class JNIDemo { static { System.loadLibrary("nativeCode"); } public native void callNative(); public static void main(String[] ...
1. JNI接口:JNI定义了一套API,允许Java代码调用本地方法(C/C++),同时本地方法也可以调用Java方法。这些接口包括了各种数据类型的转换、类加载、字段和方法的访问等。 2. 本地方法库:JNI编译后的本地方法代码...
3. **JNI接口指针**:在Java方法中传递,提供访问Java对象、类、数组等的接口。 4. **动态链接库**:编译后的本地方法代码,通常为.dll(Windows)、.so(Linux/Unix)或.dylib(Mac OS X)。 三、JNI的生命周期 1....
JNI是Java虚拟机(JVM)提供的一套接口,使得Java程序可以调用本地(非Java)代码,同时也让本地代码能够调用Java方法。这种交互方式为开发者提供了极大的灵活性,可以在Java应用程序中集成各种特定平台的功能。 2....
JNI提供了一种方式,使得Java代码可以在JVM内部通过本地方法接口调用本地方法库中的函数,这个本地方法库通常由C或C++编写,可以访问系统资源或优化性能。 JNI的主要操作包括: 1. **注册本地方法**:在Java类中...
JNI,全称Java Native Interface,是Java平台标准的一部分,它为Java程序员提供了一种机制,使得他们可以在Java代码中调用本地(非Java)代码,同时也允许本地代码调用Java方法。这一特性使得开发者能够在需要高性能...