`

运用jni接口,调用本地c方法

    博客分类:
  • jni
阅读更多
[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]
  • jni.tar.gz (3.7 KB)
  • 描述: linux下的压缩格式
  • 下载次数: 17
分享到:
评论

相关推荐

    jni本地调用4

    1. **JNI概述**:JNI是一个接口,提供了一套API,使得Java开发者可以编写本地方法来调用非Java代码,通常是C/C++,用于利用硬件特性或优化性能。这种调用方式在处理底层系统操作、图形加速、设备驱动等方面非常有用...

    jni调用java静态方法

    JNI(Java Native Interface)是Java平台提供的一种标准接口,它允许Java代码和其他语言写的代码进行交互。...理解并熟练运用JNI,可以极大地扩展Java应用程序的功能,但同时也需要对C/C++和Java两套API有深入的理解。

    NDK编译 JAVA JNI 原生调用

    它包含了一系列的头文件和库,使得Java代码能够通过JNI接口调用C/C++代码,同时也提供了交叉编译器,将C/C++源码编译为适用于不同Android架构的机器码。 2. JNI原理: JNI接口定义了一套标准的C/C++函数,这些函数...

    java运用jni调用dll实现屏蔽系统热键和任务栏

    5. **调用DLL函数**:在Java中通过JNI接口调用DLL中的函数,实现热键屏蔽和任务栏隐藏功能。 在开发过程中,需要注意的是,由于涉及到操作系统级别的操作,可能需要管理员权限运行Java程序,且不恰当的使用可能会对...

    JNI接口开发

    ### JNI接口开发详解 #### 一、Java调用Native方法的基本流程 JNI(Java Native Interface)作为Java平台的一部分,提供了一种机制使得Java代码能够调用C/C++编写的本地方法,反之亦然。这对于利用现有C/C++库或者...

    jni调用c接口完整例子

    - JNI接口定义了一套规范,让Java代码能够声明本地方法,这些方法由非Java代码实现。 - 在Java中,本地方法通过`native`关键字声明,并使用`System.loadLibrary`或`Class.forName`.`getMethodID`等方法加载动态...

    android jni 调用本地函数 c++ 格式

    它定义了一组接口和数据类型,使得Java虚拟机(JVM)能够加载和调用本地方法。在Android中,JNI主要用来实现性能敏感的代码或利用已有的C/C++库。 2. **创建JNI项目结构** 创建一个Android项目时,需要在`src/main...

    android jni调用jni 方法

    - JNI是一种接口,让Java应用程序能够调用本地(非Java)代码,同时也允许本地代码调用Java方法。 - 在Android中,JNI通常用于实现Java与C/C++之间的数据交换,提高性能,或者利用现有的C/C++库。 2. **创建JNI...

    Jni,JAVA本地调用

    JNI提供了一组接口和函数,让Java程序可以调用本地(非Java)代码,同时也能让本地代码调用Java对象和方法。在Java中,本地方法是用`native`关键字声明的,但具体的实现是在C或C++中完成的。这个过程涉及到以下几个...

    linux-java调用c语言编译的so动态库-jni例子-简单计算器

    - 创建一个Java类,通常带有`native`关键字声明的方法,表示这个方法将通过JNI调用本地代码。 - 使用`javah`工具,基于Java类生成C语言的头文件,头文件定义了Java native方法对应的C函数原型。 2. **C端的实现**...

    jni接口demo,java与cpp快捷调用

    JNI(Java Native Interface)是Java平台的标准组成部分,它允许Java代码和其他语言写的代码...理解并熟练运用JNI接口,能够帮助开发者充分利用两种语言的优点,提高代码的执行效率,同时保持代码的清晰和可维护性。

    JNI调用第三方库文件

    6. **调用本地方法**:现在可以在Java程序中通过之前定义的接口调用本地方法了。 ```java NativeScanner scanner = NativeScanner.newInstance(); scanner.scanDocument("/path/to/document"); ``` 7. **错误...

    MyJni.rar_Android jni_JNI调用脚本_NDK_android_jni

    通过"MyJni"这个案例,开发者可以学习如何在Android应用中有效地运用JNI技术,理解Java和C/C++代码之间的交互过程,从而提升应用的性能和功能。实践中,需要注意内存管理、异常处理和多线程同步等问题,以确保代码的...

    4 本地方法接口与本地方法栈.md,学习代码

    4. **动态链接**:Java虚拟机在运行时加载动态链接库(DLL或SO),使Java代码能够调用本地方法。 接下来,我们来看看本地方法栈。本地方法栈是JVM的五个主要组成部分之一,与Java虚拟机栈类似,但它专门为执行本地...

    jni代码例子

    - 调用本地方法。 4. 示例代码 - Java代码示例: ```java public class JNIDemo { static { System.loadLibrary("nativeCode"); } public native void callNative(); public static void main(String[] ...

    Android中使用jni进行本地开发

    1. JNI接口:JNI定义了一套API,允许Java代码调用本地方法(C/C++),同时本地方法也可以调用Java方法。这些接口包括了各种数据类型的转换、类加载、字段和方法的访问等。 2. 本地方法库:JNI编译后的本地方法代码...

    深入浅出JNI培训资料

    3. **JNI接口指针**:在Java方法中传递,提供访问Java对象、类、数组等的接口。 4. **动态链接库**:编译后的本地方法代码,通常为.dll(Windows)、.so(Linux/Unix)或.dylib(Mac OS X)。 三、JNI的生命周期 1....

    JNI编程指南中文版

    JNI是Java虚拟机(JVM)提供的一套接口,使得Java程序可以调用本地(非Java)代码,同时也让本地代码能够调用Java方法。这种交互方式为开发者提供了极大的灵活性,可以在Java应用程序中集成各种特定平台的功能。 2....

    java高级jni教程

    JNI提供了一种方式,使得Java代码可以在JVM内部通过本地方法接口调用本地方法库中的函数,这个本地方法库通常由C或C++编写,可以访问系统资源或优化性能。 JNI的主要操作包括: 1. **注册本地方法**:在Java类中...

    深入浅出JNI.第一讲 (JNI概述、编写首个JNI程序)

    JNI,全称Java Native Interface,是Java平台标准的一部分,它为Java程序员提供了一种机制,使得他们可以在Java代码中调用本地(非Java)代码,同时也允许本地代码调用Java方法。这一特性使得开发者能够在需要高性能...

Global site tag (gtag.js) - Google Analytics