JNI是Java Native Interface的 缩写。从Java 1.1开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计 的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。
    使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的,比如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少保证本地代码能工作在任何Java 虚拟机实现下。
    JNI(Java Native Interface)的书写步骤

  • 编写带有native声明的方法的java类
  • 使用javac命令编译所编写的java类
  • 使用javah  jni java类名生成扩展名为h的头文件
  • 使用C/C++实现本地方法
  • 将C/C++编写的文件生成动态连接库

编写java程序 这里以One world为例
public class StringDLL{
    static
    {
    System.loadLibrary("testStringJNI");
    }
    public native static String get();
    public native static void set(String name);
    public static void main(String[] args){
        StringDLL s = new StringDLL();
        s.set("Hello world");
        System.out.println(s.get());
    }
}
如果是静态类型方法则生成的头文件中方法的第二个参数是对java类的引用(JNIEnv *, jclass),如不是静态类型则是对对象的引用(JNIEnv *, jobject)
使用javah 生成扩展名为h的头文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class StringDLL */

#ifndef _Included_StringDLL
#define _Included_StringDLL
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     StringDLL
 * Method:    get
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_StringDLL_get
  (JNIEnv *, jclass);

/*
 * Class:     StringDLL
 * Method:    set
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_StringDLL_set
  (JNIEnv *, jclass, jstring);

#ifdef __cplusplus
}
#endif
#endif
使用C实现本地方法
#include "stdafx.h"
#include "testStringJNI.h"
#include <stdlib.h>
const char * chs;
jstring s;
JNIEXPORT jstring JNICALL Java_StringDLL_get(JNIEnv *env, jclass cls)
{       
    /* 简单返回转换const char为jstring */
    return (*env)->NewStringUTF(env,chs);
}
JNIEXPORT void JNICALL Java_StringDLL_set(JNIEnv *env, jclass cls, jstring s)
{
    chs = (*env)->GetStringUTFChars(env,s,0); //java与C类型不同,需用JNI方法进行转换
}
注意,我们总是用接口指针 env 来操作 Java 对象。
使用C++实现本地方法
#include "stdafx.h"

#include "testStringJNI.h"
#include <stdlib.h>
const char * chs;
jstring s;
JNIEXPORT jstring JNICALL Java_StringDLL_get(JNIEnv *env, jclass cls)
{       
    /* 简单返回转换const char为jstring */
    return env->NewStringUTF(chs);
}
JNIEXPORT void JNICALL Java_StringDLL_set(JNIEnv *env, jclass cls, jstring s)
{
    chs = env->GetStringUTFChars(s,0); //java与C类型不同,需用JNI方法进行转换
}
使用 C++ 后,源代码变得更为直接,且接口指针参数消失。但是,C++ 的内在
机制与 C 的完全一样。在 C++ 中,JNI 函数被定义为内联成员函数,它们将扩
展为相应的 C 对应函数。
生成DLL文件
在.NET下新建Win32 Project工程名字为“testStringJNI”
在Application Setting里Aplication type点选DLL
拷贝头文件到工程中
书写C++程序实现头文件中定义的方法(见上页)
按F7或Build -> Build  Solution
我们生成DLL文件就放在工程目录下Debug文件夹里。名字就是 工程名.DLL
拷贝DLL到java文件目录下,运行java就可以看到控制台打印出“One world”
一个简单java通过JNI调用C、C++就完成了

转载于:https://blog.51cto.com/39387/78069

Java JNI浅析(一)相关推荐

  1. java jni调用dll文件_Java通过jni调用动态链接库

    (1)JNI简介 JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++).从Java1.1开始,JNI标准成为java ...

  2. Java JNI简单实现

    Java JNI简单实现 JNI(Java Native Interface)允许了Java和C&C++进行交互?这不折腾人嘛! 一.JNI简述 http://baike.baidu.com/ ...

  3. java jni开发_Java JNI开发实践记录

    当使用到JNI的时候,基本可以肯定Java的平台移植性注定减弱,接下来记录一次使用Java JNI开发的经历. 关于Java JNI的相关资料参见: 下面是使用JNI常见三种场景: 1.在Java应用 ...

  4. Java JNI初体验

    Java JNI初体验 JNI是Java Native Interface的缩写,通过使用 Java本地接口书写程序,可以确保代码在不同的平台上方便移植. 从Java1.1开始,JNI标准成为java ...

  5. Java JNI调用IC卡读卡器

    Java JNI调用IC卡读卡器 Java调用IC卡读卡器的DLL一般有以下2种方式: 1.使用JNative第三方库调用IC卡读卡器dll的接口. 2.使用JNI调用IC卡读卡器dll的接口. JN ...

  6. java JNI介绍

    java JNI介绍 文章目录 java JNI介绍 1. Java调用C++代码 2.C++代码调用java代码 JNI是Java Native Interface的全称. oracle文档中是这样 ...

  7. idea java jni 调试_IntelliJ IDEA平台下JNI编程(一)—HelloWorld篇

    JNI(Java Native Interface),出于学习JNI的目的,为了能够更方便快速地运行程序.本文的是在IDEA中进行,而不在AndroidStudio,这样能够对NDK的工作过程有个更深 ...

  8. java jni key_JNIKeyProtection

    软件简介 JNIKeyProtection Android 使用 so 文件存储私密数据,并增加签名防盗机制 0x00 实际项目中引出的一些需求问题 有时你需要在客户端存放一些保密的数据,比如某些授权 ...

  9. java jni demo_Android JNI:让你一眼知之的JNI DEMO

    Android JNI:让你一眼知之的JNI DEMO 先按照步骤把 DEMO 跑成功. image 1. 使用 AS 创建一个 Android 项目 注意☑️: image 剩下的就 next fi ...

最新文章

  1. Python学习--not语句
  2. SAP S/4HANA现金管理之变
  3. 为什么“我”只给iOS做了应用?
  4. Python情感分析:鹿晗的粉丝们究竟原谅他了吗?
  5. 清空mysql注册表步骤_完全卸载MySQL 数据库清空MySql注册表
  6. [BC]Four Inages Strategy(三维空间判断正方形)
  7. 正则表达式的捕获性分组/反向引用
  8. java ssh 那一层应该捕获异常_java ssh异常(大神来看看啊)
  9. 为什么说区块链是具有革命性意义的?
  10. iOS开发之通过代理逆向传值
  11. 拓端tecdat|R语言使用ARIMAX预测失业率经济时间序列数据
  12. C语言图书信息管理系统
  13. iphone 计算机乱码,苹果电脑Word变乱码怎么办
  14. matlab输出动态gif图片
  15. 64 ---- 平面与直线的位置关系
  16. 第5章 Stata非参数检验
  17. 高校动态|研究生被录取后放导师鸽子,学校要上报教育部失信名单取消其推免资格
  18. 小白成为大数据工程师 需掌握哪些知识技能
  19. 计算机~通信领域几百本常用电子书合集
  20. Git 操作基础总结详细(Mas版+Win版)更新中,,,

热门文章

  1. keycloak 调研资料
  2. 关于IPv4设置一些常见问题的解答
  3. 【Luogu】P3380树套树模板(线段树套Splay)
  4. 【河南省多校脸萌第六场 E】LLM找对象
  5. commonjs是什么_JavaScript模块化标准CommonJS/AMD/CMD/UMD/ES6Module的区别
  6. uniapp自定义条件编译-定制化产品
  7. PCL:python pcl解码RGB- point_cloud2.read_points rgb
  8. 三维重建:三维空间中平面的旋转公式
  9. 实例分割:MaskXRCnn 与Visual Genome数据集
  10. QT4使用HDF5 类型错误