`

【转】初试JNI Java与C/C++交互

    博客分类:
  • Java
阅读更多
原文出处: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集合

    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++

    通过 JNI,Java 程序可以调用 C/C++ 代码,实现 Java 与 native 代码的交互。 在本例中,我们将详细介绍如何使用 JNI 将 Java 代码与 C/C++ 代码集成,生成动态库,并加载到 Java 程序中。 JNI 概述 JNI 提供了一...

    JNI DEMO:java jni技术 调用 c/c++ 的dll

    "native.jar"是一个Java类库,可能包含了Java层与C/C++交互的类,这些类声明了native方法并负责加载DLL。在运行Java应用时,需要确保环境变量`java.library.path`包含了DLL文件的位置,这样Java虚拟机才能找到并加载...

    JNI 教程 java与c/c++互相调用

    - **JNI调试**:可以使用`jdwp`(Java Debug Wire Protocol)来远程调试JNI代码,也可以在C/C++代码中插入`printf`语句进行输出调试。 5. **Android中的JNI** - **Android.mk文件**:在Android项目中,使用`...

    使用C/C++实现Java的Native方法接口(JNI)/ JNI编程(C/C++) 代码实例

    JNI提供了大量API用于在Java和C/C++之间交互,如创建和销毁Java对象、调用方法、访问字段、处理数组、异常处理等。例如: - `env-&gt;FindClass(className)`:查找Java类。 - `env-&gt;GetMethodID(cls, methodName, ...

    JNI技术手册 c/c++调用java

    ### JNI技术手册:C/C++与Java互调详解 #### 一、JNI技术概览 **JNI(Java Native Interface)** 是Java平台的一部分,它允许Java代码与其他语言写的代码进行交互,尤其是C和C++。JNI是Java与本地代码之间沟通的...

    JNI java c/c++技术手册

    本手册专注于介绍如何使用JNI来实现Java与C/C++之间的互调。 一、JNI基础知识 1. JNI接口定义:JNI提供了丰富的函数接口,如NewGlobalRef、FindClass、GetMethodID等,用于在Java和本地代码之间建立桥梁。 2. 本地...

    C_Java_Transfer.zip

    在IT行业中,跨语言通信是常见且至关重要的任务,特别是在Android开发中,Java与C/C++的交互尤为重要。本篇文章将深入探讨如何使用JNI(Java Native Interface)来实现在C/C++结构体与Java类之间进行数据转换。通过...

    java写的一个使用jni调用c/c++的dll

    首先,JNI提供了一个标准的方法,让Java代码可以与本地代码交互,如C/C++。在Java程序中,我们定义`native`方法,这些方法的实现不在Java字节码中,而是由本地代码(如C/C++)提供。Java虚拟机(JVM)会加载这些本地...

    Android项目下使用JNI进行C/C++和Java互相调用

    在Android开发中,JNI(Java Native Interface)是一个关键的技术,它允许Java代码和其他语言(如C/C++)的代码进行交互。本项目演示了如何在Android应用中使用JNI,实现C/C++与Java的双向调用。以下是关于这个主题...

    使用JNI进行混合编程:在Java中调用C/C++本地库

    在这里,你可以调用任何C/C++代码,与Java对象交互。 - 编译C/C++代码,生成动态链接库。例如,在Windows上,你可以使用`cl Sample1.cpp /Fe:Sample1.dll /LD`。 3. **Java端加载本地库**: - 在Java代码中,我们...

    java调用C/C++过程

    Java调用C/C++的过程,通常被称为JNI(Java Native Interface),是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互...希望这个教程能为初学者提供一个良好的起点,进一步探索Java与C/C++之间的交互。

    java调用C/C++的例子

    Java调用C/C++是跨语言编程中常见的一种技术,主要通过Java的Native Interface (JNI) 实现。JNI 是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互,尤其是C和C++。在很多情况下,这可以利用现有的...

    Java 调用C/C++程序

    这些API使得C/C++代码能与Java对象进行无缝交互。 总之,Java调用C/C++程序的能力通过JNI得以实现,这是一种强大的技术,使得Java应用能够充分利用本地系统的资源,同时也保留了Java的跨平台优势。虽然使用JNI会...

    JAVA调用C/C++ DLL文件方法

    JAVA 调用 C/C++ 库文件(DLL)是 Java 语言与 C/C++ 语言之间的交互方式之一。在 Java 中,存在多种调用 C/C++ 库文件的方式,包括 JNI、JNative、Jawin 和 Jacob 等。其中,JNI(Java Native Interface)是 Java ...

    android NDK入门篇----混合使用java和c/c++代码 源码工程

    混合使用Java和C/C++代码时,我们通常会使用JNI(Java Native Interface)。JNI是Java平台的标准接口,它允许Java代码与其他语言编写的代码进行交互。在Android中,JNI被用来在Java层和C/C++层之间建立桥梁。创建一...

    java调用C/C++全过程

    通过上述步骤,我们可以实现Java与C/C++之间的交互,这对于需要高性能计算或特定硬件访问的应用来说非常有用。虽然这个过程相对复杂,但掌握后能够极大地扩展Java应用程序的能力。希望本篇文章能帮助开发者更好地...

    JNI实现C/C++与Android/JAVA相互调用

    Android JNI/NDK开发(2)JNI实现C/C++与Android/JAVA相互调用 http://blog.csdn.net/u014702653/article/details/71141423

    JNI学习指南(java 调用C/C++接口)

    JNI作为Java与本地代码之间的重要桥梁,对于那些希望利用Java的高级特性和C/C++的强大性能优势的开发者来说至关重要。通过本指南的学习,读者应该能够理解如何在Java中声明和调用本地方法,以及如何在C/C++中实现...

    JNI实现java cpp相互调用

    C/C++中访问Java方法 C/C++中访问Java父类的方法 C/C++中访问/修改Java变量 Java中访问C/C++方法 Java中访问/修改C/C++变量 动态方式实现: C/C++中访问Java方法 C/C++中访问Java父类的方法 C/C++中访问/修改Java...

Global site tag (gtag.js) - Google Analytics