`
talentluke
  • 浏览: 604446 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

一个简单的JNI示例

 
阅读更多

Java Native Interface(JNI)是Java语言的本地编程接口,是J2SDK的一部分。在java程序中,我们可以通过JNI实现一些用java语言不便实现的功能。通常有以下几种情况我们需要使用JNI来实现。
标准的java类库没有提供你的应用程序所需要的功能,通常这些功能是平台相关的
你希望使用一些已经有的类库或者应用程序,而他们并非用java语言编写的
程序的某些部分对速度要求比较苛刻,你选择用汇编或者c语言来实现并在java语言中调用他们
在《java核心技术》中,作者提到JNI的时候,建议不到万不得已不要使用JNI技术,一方面它需要你掌握更多的知识才可以驾驭,一方面使用了JNI你的程序就会丧失可移植性。

下面我们开始编写HelloWorld程序,由于涉及到要编写c/c++代码因此我们会在开发中使用Microsoft VC++工具。

编写java代码
我们在硬盘上建立一个hello目录作为我们的工作目录,首先我们需要编写自己的java代码,在java代码中我们会声明native方法,代码非常简单。如下所示
class HelloWorld
{
    public native void displayHelloWorld();
    static {
        System.loadLibrary("hello");
    }
   
    public static void main(String[] args) {
        new HelloWorld().displayHelloWorld();
    }
}
注意我们的displayHelloWorld()方法的声明,它有一个关键字native,表明这个方法使用java以外的语言实现。方法不包括实现, 因为我们要用c/c++语言实现它。注意System.loadLibrary("hello")这句代码,它是在静态初始化块中定义的,系统用来装载 hello共享库,这就是我们在后面生成的hello.dll(如果在其他的操作系统可能是其他的形式,比如hello.so)
编译java代码
javac HelloWorld.java  生成HelloWorld.class文件
创建.h文件
这一步中我们要使用javah命令生成.h文件,这个文件要在后面的c/c++代码中用到,我们运行
javah HelloWorld。这样我们可以看到在相同目录下生成了一个HelloWorld.h文件,文件内容如下
在此我们不对他进行太多的解释。
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloWorld
 * Method:    displayHelloWorld
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
  (JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
编写本地实现代码
在这部分我们要用C/C++语言实现java中定义的方法,我们在VC++中新建一个Project,然后创建一个HelloWorldImp.cpp文件,内容如下
#include <jni.h>
#include "HelloWorld.h"
#include <stdio.h>

JNIEXPORT void JNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
    printf("Hello world!/n");
    return;
}
注意我们这里include了 jni.h和刚才得到的HelloWorld.h文件。因此你要在VC++里面设置好,jni.h在JAVA_HOME/include里面。编译通过后再生成hello.dll文件。
运行java程序
把上面生成的hello.dll文件复制到我们的工作目录,这时候我们的目录中包括HelloWorld.java,HelloWorld.class和hello.dll文件。运行java HelloWorld命令,则可在控制台看到Hello world|
的输出了。
    JNI是一门复杂,有趣且富有挑战性的技术,我们在后面的几篇文章中将说明如何在java语言和Native语言之间进行交互。

分享到:
评论

相关推荐

    android源码下编译jni示例项目代码

    - 例如,一个简单的加法操作可能通过以下JNI函数实现: ```c JNIEXPORT jint JNICALL Java_com_example_LongTest2_add (JNIEnv *env, jobject obj, jint a, jint b) { return a + b; } ``` - 这个函数的签名...

    JNI实现示例DEMO

    要创建一个JNI应用,你需要遵循以下步骤: 1. **定义Java接口**:首先,在Java类中声明一组native方法,这些方法将在本地代码中实现。例如: ```java public class NativeDemo { static { System.loadLibrary(...

    Android JNI示例

    这个"Android JNI示例"提供了学习JNI调用流程的实践指导。 JNI的核心概念包括以下几个部分: 1. **本地方法**: 在Java类中声明但由本地(非Java)代码实现的方法。这些方法通常用`native`关键字标识。 2. **...

    jni示例调用

    以下是一个简单的JNI示例,演示了如何访问和修改一个对象的实例成员域: 1. **访问一个实例成员域的步骤** (Procedure for Accessing an Instance Field) - 首先,本地方法需要获取对象的类引用(`jclass`),通过`...

    JNI示例的源码

    在本示例中,我们有两个JNI的实例,分别展示了如何实现一个无参数无返回值的本地方法和一个带有参数及返回值的本地方法。通过这两个示例,我们可以深入理解JNI的工作原理和使用方式。 首先,`nativeHello.dll`和`...

    AndroidStudio jni 示例

    - 添加JNI支持:在项目结构中,确保勾选了"Include C++ support",这会自动生成一个`app/src/main/cpp`目录,用于存放C++源代码。 3. **编写JNI代码**: - 定义JNI函数:在Java源文件中,使用`native`关键字声明...

    Android JNI示例代码

    在Android开发中,Java Native Interface (JNI) 是一个至关重要的技术,它允许Java代码与本地(C/C++)代码交互。JNI在很多场景下都扮演着关键角色,比如提升性能、利用硬件加速、调用已有的C库或者实现低级别操作。...

    Androidstudio调用jni的示例

    这个“Androidstudio调用jni的示例”是一个基础教程,旨在帮助初学者理解如何在Android Studio项目中使用JNI来调用本地C/C++代码。下面将详细介绍这个示例中的关键步骤和涉及的知识点。 1. **创建JNI接口** 在Java...

    jni程序开发简单示例和说明(eclipse + Microsoft Visual Studio 2010).zip

    本示例是关于如何在Eclipse开发环境中结合Microsoft Visual Studio 2010来实现JNI程序开发的一个详细教程。 首先,我们需要理解JNI的核心概念。JNI允许Java应用程序调用本地(非Java)代码,比如C++,并反之亦然。...

    jni示例vs2005 c++实现

    jni示例vs2005 c++实现,有c++项目源文件,供大家参照,在java目录中直接运行,java TestJni 出效果!

    android-ndk-jni示例代码

    这里,`stringFromJNI()` 是一个 native 方法,通过 `System.loadLibrary("hello-jni")` 加载名为 "hello-jni" 的本地库。 2. **生成JNI头文件**:使用NDK的`javah`工具,我们可以从Java类中生成对应的C/C++头文件...

    Android Studio 数组传递 JNI 示例程序

    在Java层定义一个方法,该方法将接收一个整型数组,并声明为native。例如: ```java public class MainActivity extends AppCompatActivity { static { System.loadLibrary("testjni"); // 加载动态链接库 } ...

    java jni简单实例

    本资源提供的“java jni简单实例”是一个实际应用JNI的示例,有助于学习和理解JNI的工作原理。 首先,我们来看JNI的核心概念: 1. **本地方法接口**:JNI定义了一套接口,使得Java代码能够声明本地方法(即非Java...

    非常不错的jni示例程序

    总结一下,这个“非常不错的JNI示例程序”主要涵盖了以下几个关键知识点: 1. **JNI基本结构**:Java源代码、头文件、本地代码、动态链接库以及加载库的过程。 2. **JNI函数调用**:如何使用`JNIEnv`指针调用Java...

    Android学习-JNI示例代码

    本篇文章将深入探讨Android学习中的JNI示例代码。 JNI的核心在于它的接口,它为Java程序员提供了一种方式来编写C++代码,这些代码可以被Java虚拟机(JVM)直接调用。在Android平台上,JNI通常用于优化性能,特别是...

    Java中使用Jni简单示例过程

    在给定的文档中,我们看到的是一个简化的示例,演示如何在Java中使用JNI调用C/C++代码。下面是对这一过程的详细解释: 1. **创建Java工程** 首先,在Eclipse IDE中创建一个新的Java工程,命名为`TestNativeCode`...

    coco2dx JNI示例,java c++相互调用

    在这个"Coco2dx JNI示例,java c++相互调用"的项目中,我们将深入探讨如何在Cocos2dx游戏引擎中使用JNI实现Java和C++之间的通信。 1. **JNI基础** JNI是Java平台提供的一个标准接口,它允许Java代码调用本地(非...

    Android JNI基本示例

    文件`NativeInvokeMethod`可能是一个示例代码,演示如何从本地代码调用Java方法。它可能包含了如何声明和实现`native`方法,以及如何在C/C++代码中找到并执行Java方法的步骤。 8. **实践应用**: JNI在Android中...

    windows下 eclipse+ndk编译及使用jni示例

    1.) 在项目根目录下创建jni目录,下面是要放进去的第一个文件Android.mk LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := main_jni #LOCAL_CFLAGS := LOCAL_SRC_FILES := main.cpp #LOCAL_...

    一个简单的OpenGL ES 3.0 示例 (Android NDK jni)

    一个简单的OpenGL ES 3.0 示例 (Android NDK jni)

Global site tag (gtag.js) - Google Analytics