本例子使用的操作系统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的基本用法。 1. **JNI基础概念** JNI是一个接口,它定义了Java虚拟机(JVM)与本地代码(如C/C++)之间的通信规范。通过JNI,Java开发者可以在Java程序中调用本地方法...
这个“jni最简单例子,注释详细”应该是提供了一个基础的JNI学习教程,下面我们将深入探讨JNI的相关知识点。 1. **JNI概述** JNI是一种接口,使得Java应用程序可以调用本地(非Java)代码,也可以让本地代码调用...
本资源提供的“java jni简单实例”是一个实际应用JNI的示例,有助于学习和理解JNI的工作原理。 首先,我们来看JNI的核心概念: 1. **本地方法接口**:JNI定义了一套接口,使得Java代码能够声明本地方法(即非Java...
在这个"第一个JNI实例学习"中,我们将探讨如何创建并运行一个基本的JNI程序。 首先,我们需要理解JNI的核心概念。JNI提供了一套接口,让Java代码能够声明本地方法,这些方法在运行时由本地(非Java)代码实现。本地...
本教程将通过一个最简单的JNI实例——"SimpleJniDemo",帮助你理解如何在Android Studio环境下使用NDK进行JNI开发。 首先,我们需要创建一个新的Android项目,并在项目中添加对NDK的支持。在Android Studio中,选择...
一个jni例子,放到桌面直接编译就能跑,一个jni例子,放到桌面直接编译就能跑,一个jni例子,放到桌面直接编译就能跑,一个jni例子,放到桌面直接编译就能跑,一个jni例子,放到桌面直接编译就能跑,一个jni例子,放...
Java的JNI(Java Native Interface)本地调用是一个关键的技术,它允许Java代码直接调用C/C++编写的原生库,极大地扩展了Java应用程序的功能。在这个简单实例中,我们将探讨如何实现这一过程,同时注意到由于Java和...
本例子展示了如何通过JNI在Android应用中显示一个Dialog。 首先,我们需要创建一个本地方法(native method)在Java类中声明,这个方法将在C/C++代码中实现。例如: ```java public class MainActivity extends ...
在本实例中,我们将探讨如何使用Eclipse集成开发环境来创建一个简单的JNI项目,实现C语言与Java之间的字符串传递。 首先,我们需要了解JNI的基本概念。JNI提供了一种方式,使得Java应用程序能够调用本地(非Java)...
在这个简单的JNI实例中,我们将深入理解JNI的工作原理,并通过一个实际的示例来展示其使用方法。 首先,我们需要了解JNI的基本概念。JNI接口定义了一组C/C++函数,这些函数可以被Java虚拟机(JVM)调用来与本地代码...
首先,作者介绍了 C++ DLL 文件的创建过程,并定义了一个简单的 add 方法,接着在 Java 端使用 JNI 技术调用 C++ DLL 文件。最后,作者还提供了 Java 代码的实现细节。 知识点: 1. JNI 技术的基本概念和应用 2. ...
总结,通过以上步骤,我们成功地在Android应用中引入了JNI,并实现了从Java调用C代码的简单实例。理解并掌握JNI的使用,能让你在Android开发中更好地利用已有的C/C++库,提高代码效率,或者实现一些Java无法直接完成...
下面将根据提供的文件内容,详细介绍如何通过一个简单的“Hello World”示例来学习JNI的基础知识。 #### 编写Java代码 首先,我们需要编写一个简单的Java类`HelloWorld.java`。这个类中包含了一个本地方法`myPrint...
Java Native Interface(JNI)是Java平台的标准组成部分,它允许...这就是一个简单的JNI返回对象数组的例子。通过这种方式,我们可以灵活地在Java和本地代码之间传递复杂的数据结构,极大地扩展了Java应用程序的能力。
Android Studio是一款专为Android应用开发设计的...通过这个简单的实例,你已经掌握了Android Studio中JNI编程的基本步骤。随着深入学习,你可以使用JNI实现更复杂的任务,如与原生库交互、调用硬件接口、优化性能等。
### JNI攻略之一——建立一个简单的JNI程序:详细解析 #### 一、理解JNI与跨语言编程 JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码与其他语言(如C/C++)编写的代码进行交互。这在需要高...
这篇博客将引导我们完成在Ubuntu环境下创建并运行一个简单的JNI示例。 首先,我们需要了解JNI的基本概念。JNI接口提供了Java虚拟机(JVM)与本地代码之间的桥梁。当Java程序需要执行一些只能由原生代码完成的任务时...
这个"linux-java调用c语言编译的so动态库-jni例子-简单计算器"是一个典型的示例,展示了如何利用JNI来创建一个Java应用程序,该程序能够调用C编写的动态链接库(.so文件)进行计算操作。 JNI是Java平台的一部分,它...
本教程将通过一个简单的例子来介绍如何使用JNI和NDK进行开发。 首先,我们需要创建一个Android项目,包含一个简单的按钮和一个TextView。按钮的作用是触发JNI函数的调用,而TextView则用来显示JNI函数返回的结果。...
在这个"Android jni 编程实例"中,我们将探讨如何在Android Studio环境下进行JNI开发,通过一个简单的入门demo来学习这个过程。 首先,我们需要了解JNI的基本概念。JNI是Java平台提供的一种接口,它允许Java代码...