`
brandNewUser
  • 浏览: 456410 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JNI的一个简单实例

阅读更多

本例子使用的操作系统MacOS, 64位JVM。

 

JNI编写的几个步骤如下:

 

编写Java代码,并注明native方法:

 

public class HelloJni {

    public native void displayHelloJni();

    public static void main(String[] args) {
        HelloJni helloJni = new HelloJni();
        helloJni.displayHelloJni();
    }

    static {
        System.loadLibrary("HelloJniImpl");
    }
}

 

其中声明displayHelloJni()方法为本地方法,在static静态块中用System.loadLibrary()加载本地库。

 

使用javac命令编译此java类:

 

javac com/xxx/clamaa/jni/HelloJni.java 

  

 

利用javah命令生成C语言的头文件(.h文件)

 

javah com.xxx.clamaa.jni.HelloJni

 

 

执行完成后,就在执行路径下生成名称为com_xxx_clamaa_jni_HelloJni.h的头文件:

 

#include <jni.h>
/* Header for class com_xxx_clamaa_jni_HelloJni */

#ifndef _Included_com_xxx_clamaa_jni_HelloJni
#define _Included_com_xxx_clamaa_jni_HelloJni
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_yonyou_clamaa_jni_HelloJni
 * Method:    displayHelloJni
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_xxx_clamaa_jni_HelloJni_displayHelloJni
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

 

 

然后在同级的目录下新建一个HelloJniImpl.cpp文件,这个与HelloJni.java中定义的System.loadLibrary()的文件名一致。

 

 

#include "com_xxx_clamaa_jni_HelloJni.h"
#include <iostream>
#include <jni.h>
using namespace std;
/*
 * Class:     HelloWorld
 * Method:    displayHelloWorld
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_xxx_clamaa_jni_HelloJni_displayHelloJni
  (JNIEnv *, jobject)
 {
    cout << "Hello Jni by clamaa!";
    return;
}

 

编译C++代码的时候在MacOS下和在Linux Windows有所不同, 不是编译成.so或者dll, 而是MacOS自己的jnilib. 并且jni.h的目录也比较特殊, 是/System/Library/Frameworks/JavaVM.framework/Headers/,执行的命令g++,

g++ -dynamiclib -o libhellojniimpl.jnilib HelloJniImpl.cpp -framework JavaVM -I/System/Library/Frameworks/JavaVM.framework/Headers

 

编译完成后,就生成libhellojniimpl.jnilib文件,此时执行结果为:

java com.xxx.clamaa.jni.HelloJni
>Hello Jni by clamaa!

 

生成的文件名称必须为: libhellojniimpl.jnilib,否则抛出异常:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no HelloJniImpl in java.library.path
	at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1857)
	at java.lang.Runtime.loadLibrary0(Runtime.java:870)
	at java.lang.System.loadLibrary(System.java:1119)
	at com.yonyou.clamaa.jni.HelloJni.<clinit>(HelloJni.java:16)

 

如果设置成带参数的本地方法,那么生成的参数会多一个jstring

Java_HelloWorld_print(JNIEnv *env, jobject obj, jstring str)

 

与原来的实现方式,调用方式都一样,这样简单的JNI实现就完成了。 

 

 如果我们在原来的cpp实现中加入一行抛出异常的代码:

cout << "Hello Jni by clamaa!";
throw 1;
return;

 

那么在执行的过程中也会抛出对应的错误:

java com.yonyou.clamaa.jni.HelloJni
>libc++abi.dylib: terminating with uncaught exception of type int
>Hello Jni by clamaa!Abort trap: 6

 

 

分享到:
评论

相关推荐

    JNI简单实例

    本教程将通过一个简洁的实例,帮助你理解JNI的基本用法。 1. **JNI基础概念** JNI是一个接口,它定义了Java虚拟机(JVM)与本地代码(如C/C++)之间的通信规范。通过JNI,Java开发者可以在Java程序中调用本地方法...

    jni最简单例子,注释详细

    这个“jni最简单例子,注释详细”应该是提供了一个基础的JNI学习教程,下面我们将深入探讨JNI的相关知识点。 1. **JNI概述** JNI是一种接口,使得Java应用程序可以调用本地(非Java)代码,也可以让本地代码调用...

    java jni简单实例

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

    第一个JNI实例学习

    在这个"第一个JNI实例学习"中,我们将探讨如何创建并运行一个基本的JNI程序。 首先,我们需要理解JNI的核心概念。JNI提供了一套接口,让Java代码能够声明本地方法,这些方法在运行时由本地(非Java)代码实现。本地...

    Jni最简单的实例demo

    本教程将通过一个最简单的JNI实例——"SimpleJniDemo",帮助你理解如何在Android Studio环境下使用NDK进行JNI开发。 首先,我们需要创建一个新的Android项目,并在项目中添加对NDK的支持。在Android Studio中,选择...

    jni简单的例子,初学者一看就会

    一个jni例子,放到桌面直接编译就能跑,一个jni例子,放到桌面直接编译就能跑,一个jni例子,放到桌面直接编译就能跑,一个jni例子,放到桌面直接编译就能跑,一个jni例子,放到桌面直接编译就能跑,一个jni例子,放...

    java 的jni本地调用简单实例

    Java的JNI(Java Native Interface)本地调用是一个关键的技术,它允许Java代码直接调用C/C++编写的原生库,极大地扩展了Java应用程序的功能。在这个简单实例中,我们将探讨如何实现这一过程,同时注意到由于Java和...

    一个简单的jni显示Dialog的例子

    本例子展示了如何通过JNI在Android应用中显示一个Dialog。 首先,我们需要创建一个本地方法(native method)在Java类中声明,这个方法将在C/C++代码中实现。例如: ```java public class MainActivity extends ...

    eclipse使用jni的简单实例

    在本实例中,我们将探讨如何使用Eclipse集成开发环境来创建一个简单的JNI项目,实现C语言与Java之间的字符串传递。 首先,我们需要了解JNI的基本概念。JNI提供了一种方式,使得Java应用程序能够调用本地(非Java)...

    JNI的简单实例

    在这个简单的JNI实例中,我们将深入理解JNI的工作原理,并通过一个实际的示例来展示其使用方法。 首先,我们需要了解JNI的基本概念。JNI接口定义了一组C/C++函数,这些函数可以被Java虚拟机(JVM)调用来与本地代码...

    JNI 调用实例(java JNI cpp互相调用实例)

    首先,作者介绍了 C++ DLL 文件的创建过程,并定义了一个简单的 add 方法,接着在 Java 端使用 JNI 技术调用 C++ DLL 文件。最后,作者还提供了 Java 代码的实现细节。 知识点: 1. JNI 技术的基本概念和应用 2. ...

    Android调用JNI的简单实例(附详细步骤)

    总结,通过以上步骤,我们成功地在Android应用中引入了JNI,并实现了从Java调用C代码的简单实例。理解并掌握JNI的使用,能让你在Android开发中更好地利用已有的C/C++库,提高代码效率,或者实现一些Java无法直接完成...

    jni的简单入门实例

    下面将根据提供的文件内容,详细介绍如何通过一个简单的“Hello World”示例来学习JNI的基础知识。 #### 编写Java代码 首先,我们需要编写一个简单的Java类`HelloWorld.java`。这个类中包含了一个本地方法`myPrint...

    jni返回对象数组例子

    Java Native Interface(JNI)是Java平台的标准组成部分,它允许...这就是一个简单的JNI返回对象数组的例子。通过这种方式,我们可以灵活地在Java和本地代码之间传递复杂的数据结构,极大地扩展了Java应用程序的能力。

    Android studio jni简单编程实例

    Android Studio是一款专为Android应用开发设计的...通过这个简单的实例,你已经掌握了Android Studio中JNI编程的基本步骤。随着深入学习,你可以使用JNI实现更复杂的任务,如与原生库交互、调用硬件接口、优化性能等。

    JNI攻略之一――建立一个简单的JNI程序

    ### JNI攻略之一——建立一个简单的JNI程序:详细解析 #### 一、理解JNI与跨语言编程 JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码与其他语言(如C/C++)编写的代码进行交互。这在需要高...

    ubuntu下第一个Jni例子

    这篇博客将引导我们完成在Ubuntu环境下创建并运行一个简单的JNI示例。 首先,我们需要了解JNI的基本概念。JNI接口提供了Java虚拟机(JVM)与本地代码之间的桥梁。当Java程序需要执行一些只能由原生代码完成的任务时...

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

    这个"linux-java调用c语言编译的so动态库-jni例子-简单计算器"是一个典型的示例,展示了如何利用JNI来创建一个Java应用程序,该程序能够调用C编写的动态链接库(.so文件)进行计算操作。 JNI是Java平台的一部分,它...

    Jni_Ndk开发最简单的例子

    本教程将通过一个简单的例子来介绍如何使用JNI和NDK进行开发。 首先,我们需要创建一个Android项目,包含一个简单的按钮和一个TextView。按钮的作用是触发JNI函数的调用,而TextView则用来显示JNI函数返回的结果。...

    Android jni 编程实例

    在这个"Android jni 编程实例"中,我们将探讨如何在Android Studio环境下进行JNI开发,通过一个简单的入门demo来学习这个过程。 首先,我们需要了解JNI的基本概念。JNI是Java平台提供的一种接口,它允许Java代码...

Global site tag (gtag.js) - Google Analytics