原文出处: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++交互相关推荐

  1. JNI Java本地接口(双向接口)

    JNI:Java程序(VM)与本地函数的双向接口(调用通道) (1)Java --JNI通道-->本地函数(JNI函数) (2)本地程序--JNI通道的JNI接口-->Java       ...

  2. JNI (Java Native Interface)是什么

    JNI是Java Native Interface的缩写.从Java 1.1开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代 ...

  3. JAVA与SAP数据交互的方式总结

    JAVA与SAP数据交互的方式总结 RFC方式:Java程序直接通过RFC访问SAP的对象(或称函数,可能叫法不对)     SAP提供了BAPI(Business Application Progr ...

  4. java窗体与Flash交互

    最近在研究flash,用flash去读取文件很简单,但是存储文件就很麻烦了. 因此想到用java的窗体进行交互. 下面是DJNativeSwing-SWT-1-0-3-20140708的下载链接: h ...

  5. Java进程与子进程交互

    /* * Java进程与子进程交互 * */ public class RunyimeDemo {public static void main(String[] args){Runtime run ...

  6. java毕业设计医疗病历交互系统Mybatis+系统+数据库+调试部署

    java毕业设计医疗病历交互系统Mybatis+系统+数据库+调试部署 java毕业设计医疗病历交互系统Mybatis+系统+数据库+调试部署 本源码技术栈: 项目架构:B/S架构 开发语言:Java ...

  7. 基于JAVA企业间信息交互系统计算机毕业设计源码+数据库+lw文档+系统+部署

    基于JAVA企业间信息交互系统计算机毕业设计源码+数据库+lw文档+系统+部署 基于JAVA企业间信息交互系统计算机毕业设计源码+数据库+lw文档+系统+部署 本源码技术栈: 项目架构:B/S架构 开 ...

  8. JNI 之Java和c/c++交互,提升Java变成效率

    JNI 主要是java和c++相互调用,java可以把效率低,耗时操作比较严重的逻辑放在c++里面.可以大大提升效率和节省资源. 下面是java调用的windows下的 c++的dll动态库,还有一种 ...

  9. jni java与c++交互返回三维数组jobjectArray

    1.在java里创建一个类,在类里添加静态方法调用c++的类库dll,在java里创建要返回数组的函数.在java的main方法里创建返回后的测试方法. Java代码   package cn.gov ...

最新文章

  1. JVM内存调优原则及几种JVM内存调优方法
  2. 协程、asyncio、异步编程
  3. [OS复习]设备管理1
  4. 手机浏览器访问本地html,如何经过Html网页调用本地安卓app?
  5. [Python人工智能] 三十三.Bert模型 (2)keras-bert库构建Bert模型实现文本分类
  6. C#并发编程之异步编程(一)
  7. linux top 命令的结果
  8. java模块间调用信息_java与c++模块之间的交互方法?
  9. python常见图形代码可视化大全整理(包括动图)
  10. 教你pe系统bootice修复系统引导教程
  11. android jni stl,Android NDK中C++ STL库动态和静态链接
  12. html编辑器pp,在线轻设计工具之H5
  13. kali linux怎么入侵手机,Kali Linux-Metasploit入侵Android手机
  14. 程维任正非马化腾马云们在为柳传志呼唤什么?
  15. Filco圣手二代双模蓝牙机械键盘|科大讯飞鼠标连接Mac方法
  16. 简单工厂和工厂方法模式的区别和个人看法
  17. 如何取消U盘上的设备加密功能Bitlocker——win10家庭版磁盘上有个锁的解决办法——详细操作版本
  18. JUC(十)-线程池-ThreadPoolExecutor分析
  19. html5兼容问题,【HTML5分享】关于浏览器的兼容问题
  20. Cookie的禁用处理

热门文章

  1. python筛选时间段_django admin管理工具自定义时间区间筛选器DateRangeFilter介绍
  2. 未找到插件 ‘org.springframework.bootspring-boot-maven-plugin‘(已解决 )
  3. 手机模板区块(HTML、CSS)
  4. 微信小程序 webview 传递URL中含有特殊字符-,=
  5. 奇异矩阵能lu分解条件_矩阵的酉不变范数,樊畿控制定理,次可乘性质,p次对称度规函数...
  6. 恐怖谷与深度爵士:计算机艺术能达到人类的高峰吗
  7. java中文转Unicode
  8. 03 聚类算法 - K-means聚类
  9. Spring 数据处理框架的演变
  10. 深度优先搜索-和为某数的所有组合