原文出处:http://wuma.koubei.com/blog/userdetail/683e7ee2fe034c74b8ef260c52e3a5cf
JNI是Java Native Interface的 缩写。从Java 1.1开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计 的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。
Java写接口,C/C++写实现,两者的交互利用JNI实现。
1、Java接口
package example;
public class Simple{
static {
//System.load("/root/test/Simple.so"); //也可利用此方法直接写绝对路径
System.loadLibrary( "Simple" );
}
//方法接口
public native static String HelloWorld ();
//利用main方法进行测试
public static void main(String[] args) {
System.out.println(HelloWorld ());
}
}
2、编译生成class文件
javac -d . Simple.java
生成Header文件
javah -classpath . -d . example.Simple
3、example_Simple.h文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#ifndef __example_Simple__
#define __example_Simple__
#include <jni.h>
#ifdef __cplusplus
extern "C"
{
#endif
extern JNIEXPORT jstring JNICALL Java_example_Simple_HelloWorld (JNIEnv *env, jclass);
#ifdef __cplusplus
}
#endif
#endif /* __example_Simple__ */
如果是分工合作,那么java部分到此为止,java中调用该接口的方式和调用普通JAVA接口没有任何区别,你只需把改头文件给你的搭档让他们写实现就OK啦。当然如果有兴趣,我们也可继续下面的讨论。
注意:要从 JDK下面的 include 文件夹中把 jni.h和 jni_md.h 两个文件 copy 到你的 VC 工程Include目录里(即:\jdk\include 文件夹)
4、JNI Implementation File
实现和由javah命令生成的头文件里面声明的方法名相同的方法。
#include <stdio.h>
#include "example_Simple.h"
JNIEXPORT jstring JNICALL Java_example_Simple_HelloWorld (JNIEnv *env, jclass){
char str[] = "Hello World!";
jstring jstr;
jstr = env->NewStringUTF(str);
return jstr;
}
5、编译生成lib文件,windows下生成.dll文件,Linux下生成.so文件。
ØLinux:
生成Simple.o文件:
g++ -O0 -fPIC -c -Wall -I. -I/usr/ali/java/include -I/usr/ali/java/include/linux Simple.cpp -o Simple.o Ø Ø 生成Simple.so文件:
g++ -shared -o Simple.so Simple.o
Windows
cl -I%java_home%\include -I%java_home%\include\win32 -LD Simple.c -FeSimple.dll
注意:生成的dll文件名在选项-Fe后面配置,这里是Simple,因为在Simple.java文 件中我们loadLibary的时候使用的名字是Simple。另外需要将-I%java_home%\include -I%java_home%\include\win32参数加上,因为在编写本地方法的时候引入了jni.h文件。
6、配置lib路径(比较麻烦)
a. 使用System.loadLibrary( name );
(1)windows下dll文件的命名可以随意,取不带后缀的文件名,例:Simple.dll,传入Simple即可。
(2)Linux下so文件的命名必须加上lib前缀, 取不带前缀和后缀的文件名,例:传入参数为Simple,则so文件名为libSimple.so。
(3)将生成的库文件copy到本机的LD_LIBRARY_PATH目录下(即配置环境变量PATH目录)。
(4)Linux下也可用export LD_LIBRARY_PATH=,设置library路径;windows下添加path路径。要注意所指引的路径应该到.so/.dll文件的上一级,如果指到.so/.dll,则会报错。
(5)Windows下直接拷贝dll到C:\WINDOWS\system32下面。
b.利用System.load(absolute path)方法,传入绝对路径找到指定文件。
7、一切配置好之后,便可进行调式了,运行命令:java Simple 运行结果:Hello World!
分享到:
相关推荐
JNI开发Java和C/C++互相传递List集合, 可以参考: Java从C/C++获取List集合对象:https://blog.csdn.net/niuba123456/article/details/80994166 Java传递List集合对象到C/C++ ...
通过 JNI,Java 程序可以调用 C/C++ 代码,实现 Java 与 native 代码的交互。 在本例中,我们将详细介绍如何使用 JNI 将 Java 代码与 C/C++ 代码集成,生成动态库,并加载到 Java 程序中。 JNI 概述 JNI 提供了一...
"native.jar"是一个Java类库,可能包含了Java层与C/C++交互的类,这些类声明了native方法并负责加载DLL。在运行Java应用时,需要确保环境变量`java.library.path`包含了DLL文件的位置,这样Java虚拟机才能找到并加载...
- **JNI调试**:可以使用`jdwp`(Java Debug Wire Protocol)来远程调试JNI代码,也可以在C/C++代码中插入`printf`语句进行输出调试。 5. **Android中的JNI** - **Android.mk文件**:在Android项目中,使用`...
JNI提供了大量API用于在Java和C/C++之间交互,如创建和销毁Java对象、调用方法、访问字段、处理数组、异常处理等。例如: - `env->FindClass(className)`:查找Java类。 - `env->GetMethodID(cls, methodName, ...
### JNI技术手册:C/C++与Java互调详解 #### 一、JNI技术概览 **JNI(Java Native Interface)** 是Java平台的一部分,它允许Java代码与其他语言写的代码进行交互,尤其是C和C++。JNI是Java与本地代码之间沟通的...
本手册专注于介绍如何使用JNI来实现Java与C/C++之间的互调。 一、JNI基础知识 1. JNI接口定义:JNI提供了丰富的函数接口,如NewGlobalRef、FindClass、GetMethodID等,用于在Java和本地代码之间建立桥梁。 2. 本地...
在IT行业中,跨语言通信是常见且至关重要的任务,特别是在Android开发中,Java与C/C++的交互尤为重要。本篇文章将深入探讨如何使用JNI(Java Native Interface)来实现在C/C++结构体与Java类之间进行数据转换。通过...
首先,JNI提供了一个标准的方法,让Java代码可以与本地代码交互,如C/C++。在Java程序中,我们定义`native`方法,这些方法的实现不在Java字节码中,而是由本地代码(如C/C++)提供。Java虚拟机(JVM)会加载这些本地...
在Android开发中,JNI(Java Native Interface)是一个关键的技术,它允许Java代码和其他语言(如C/C++)的代码进行交互。本项目演示了如何在Android应用中使用JNI,实现C/C++与Java的双向调用。以下是关于这个主题...
在这里,你可以调用任何C/C++代码,与Java对象交互。 - 编译C/C++代码,生成动态链接库。例如,在Windows上,你可以使用`cl Sample1.cpp /Fe:Sample1.dll /LD`。 3. **Java端加载本地库**: - 在Java代码中,我们...
Java调用C/C++的过程,通常被称为JNI(Java Native Interface),是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互...希望这个教程能为初学者提供一个良好的起点,进一步探索Java与C/C++之间的交互。
Java调用C/C++是跨语言编程中常见的一种技术,主要通过Java的Native Interface (JNI) 实现。JNI 是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互,尤其是C和C++。在很多情况下,这可以利用现有的...
这些API使得C/C++代码能与Java对象进行无缝交互。 总之,Java调用C/C++程序的能力通过JNI得以实现,这是一种强大的技术,使得Java应用能够充分利用本地系统的资源,同时也保留了Java的跨平台优势。虽然使用JNI会...
JAVA 调用 C/C++ 库文件(DLL)是 Java 语言与 C/C++ 语言之间的交互方式之一。在 Java 中,存在多种调用 C/C++ 库文件的方式,包括 JNI、JNative、Jawin 和 Jacob 等。其中,JNI(Java Native Interface)是 Java ...
混合使用Java和C/C++代码时,我们通常会使用JNI(Java Native Interface)。JNI是Java平台的标准接口,它允许Java代码与其他语言编写的代码进行交互。在Android中,JNI被用来在Java层和C/C++层之间建立桥梁。创建一...
通过上述步骤,我们可以实现Java与C/C++之间的交互,这对于需要高性能计算或特定硬件访问的应用来说非常有用。虽然这个过程相对复杂,但掌握后能够极大地扩展Java应用程序的能力。希望本篇文章能帮助开发者更好地...
Android JNI/NDK开发(2)JNI实现C/C++与Android/JAVA相互调用 http://blog.csdn.net/u014702653/article/details/71141423
JNI作为Java与本地代码之间的重要桥梁,对于那些希望利用Java的高级特性和C/C++的强大性能优势的开发者来说至关重要。通过本指南的学习,读者应该能够理解如何在Java中声明和调用本地方法,以及如何在C/C++中实现...
C/C++中访问Java方法 C/C++中访问Java父类的方法 C/C++中访问/修改Java变量 Java中访问C/C++方法 Java中访问/修改C/C++变量 动态方式实现: C/C++中访问Java方法 C/C++中访问Java父类的方法 C/C++中访问/修改Java...