JNI开发极简教程

简介: JNI(Java Native Interface)Java调用C/C++,C/C++调用Java的一套API前言:学习JNI需要C/C++的相关知识,而且需要研究JNI手册.

JNI(Java Native Interface)

Java调用C/C++,C/C++调用Java的一套API

前言:

学习JNI需要C/C++的相关知识,而且需要研究JNI手册.
想学习的同学,请follow我的学习笔记NDK开发学习笔记

1:在eclipse中编写native方法


public class Java2cpp {
    
    static { 
    System.loadLibrary("Project4");
    } 

    public native int DLL_ADD(int a,int b);//加
public native int DLL_SUB(int a,int b);//减
public native int DLL_MUL(int a,int b);//乘
public native int DLL_DIV(int a,int b);//除

    public static void main(String args[]){
        
    int sum = 0;
    
    Java2cpp test = new Java2cpp();

    sum = test.DLL_ADD(2, 4);
    System.out.println("Java call cpp dll result:" + sum);  
    }
    
    
}

}

2.javah命令,生成.h头文件

  • 第一步:javac Java2cpp.java  生成java2cpp.class

  • 第二步:javah Java2cpp  生成Java2cpp.h头文件,内容如下:

    img_c9e9a4e079ebf10898d7a5733bb091f2.jpe
    cmd操作

//生成的C++头文件Java2cpp.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class Java2cpp */

#ifndef _Included_Java2cpp
#define _Included_Java2cpp
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Java2cpp
 * Method:    DLL_ADD
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_Java2cpp_DLL_1ADD
  (JNIEnv *, jobject, jint, jint);

/*
 * Class:     Java2cpp
 * Method:    DLL_SUB
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_Java2cpp_DLL_1SUB
  (JNIEnv *, jobject, jint, jint);

/*
 * Class:     Java2cpp
 * Method:    DLL_MUL
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_Java2cpp_DLL_1MUL
  (JNIEnv *, jobject, jint, jint);

/*
 * Class:     Java2cpp
 * Method:    DLL_DIV
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_Java2cpp_DLL_1DIV
  (JNIEnv *, jobject, jint, jint);

#ifdef __cplusplus
}
#endif
#endif

3.复制.h头文件,jni.h和jni_md.h到CPP工程中

  • 用visual studio新建空C++项目,引入头文件Java2cpp.h,这边因为没有jni.h和jni_md.h,我们也要导入(jni.h和jni_md.h在jdk的lib中),


    img_5fcd5ace4496bd501e3e77886dc98a44.jpe
    项目结构

4.实现.h头文件中声明的函数

编写头文件Java2cpp.h的实现即testdll.cpp.部分代码如下.

#include "Java2cpp.h"

/*
* Class:     Java2cpp
* Method:    DLL_ADD
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_Java2cpp_DLL_1ADD
(JNIEnv *env, jobject obj, jint a, jint b){
    int var = 0;
    var = a + b;
    return var;
}

/*
* Class:     Java2cpp
* Method:    DLL_SUB
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_Java2cpp_DLL_1SUB
(JNIEnv *env, jobject obj, jint a, jint b){
    int var = 0;
    var = a-b;
    return var;
}

5.生成dll文件

  • 配置文件,右键上3图项目结构选择属性

    img_12be7bf8595697922ad3641c145647c6.jpe
    这里写图片描述

  • 生成解决方案即可

6.配置dll文件所在目录到环境变量

将dll文件所在目录配置到Path中,例如我把dll放在 D:\DllTools ,
则需要将 D:\DllTools; 添加到path的最前面.

7.重启Eclipse

重启查看结果


public class Java2cpp {
    
    static { 
    System.loadLibrary("Project4");
    } 

    public native int DLL_ADD(int a,int b);//加
public native int DLL_SUB(int a,int b);//减
public native int DLL_MUL(int a,int b);//乘
public native int DLL_DIV(int a,int b);//除

    public static void main(String args[]){
        
    int sum = 0;
    
    Java2cpp test = new Java2cpp();

    sum = test.DLL_ADD(2, 4);
    System.out.println("Java call cpp dll result:" + sum);  
    }
    
}

//console 显示的结果

Java call cpp dll result:6
目录
相关文章
|
6月前
|
Java API Android开发
[NDK/JNI系列01] NDK与JNI的基本概念与使用场景
[NDK/JNI系列01] NDK与JNI的基本概念与使用场景
68 0
|
3月前
|
Java Android开发 C++
Android Studio JNI 使用模板:c/cpp源文件的集成编译,快速上手
本文提供了一个Android Studio中JNI使用的模板,包括创建C/C++源文件、编辑CMakeLists.txt、编写JNI接口代码、配置build.gradle以及编译生成.so库的详细步骤,以帮助开发者快速上手Android平台的JNI开发和编译过程。
220 1
|
6月前
|
Rust Java Linux
【一起学Rust | 进阶篇 | jni库】JNI实现Java与Rust进行交互
【一起学Rust | 进阶篇 | jni库】JNI实现Java与Rust进行交互
196 0
|
移动开发 Java 开发工具
[笔记]Visual Studio 2015 开发安卓so库JNI层——HelloWorld
[笔记]Visual Studio 2015 开发安卓so库JNI层——HelloWorld
157 0
|
缓存 Java 编译器
JNI基础简介
JNI系列入门连载,开启JNI学习之旅吧。
107 0
|
算法 Java Linux
NDK 系列(5):JNI 从入门到实践,万字爆肝详解!(上)
NDK 系列(5):JNI 从入门到实践,万字爆肝详解!
547 0
NDK 系列(5):JNI 从入门到实践,万字爆肝详解!(上)
|
存储 缓存 安全
NDK 系列(5):JNI 从入门到实践,万字爆肝详解!(下)
NDK 系列(5):JNI 从入门到实践,万字爆肝详解!(下)
245 0
NDK 系列(5):JNI 从入门到实践,万字爆肝详解!(下)
|
编解码 Java Android开发
so库你应该知道的基础知识
Android系统目前支持以下七种不同的CPU架构:ARMv5,ARMv7 (从2010年起),x86 (从2011年起),MIPS (从2012年起),ARMv8,MIPS64和x86_64 (从2014年起),每一种都关联着一个相应的ABI。
343 0
|
Java API Android开发
JNI开发环境和基础配置
JNI开发环境和基础配置
401 0
JNI开发环境和基础配置
|
Java Android开发 C++
【Android NDK 开发】Kotlin 语言中使用 NDK ( 创建支持 Kotlin 的 NDK 项目 | Kotlin 语言中使用 NDK 要点 | 代码示例 )(二)
【Android NDK 开发】Kotlin 语言中使用 NDK ( 创建支持 Kotlin 的 NDK 项目 | Kotlin 语言中使用 NDK 要点 | 代码示例 )(二)
205 0
【Android NDK 开发】Kotlin 语言中使用 NDK ( 创建支持 Kotlin 的 NDK 项目 | Kotlin 语言中使用 NDK 要点 | 代码示例 )(二)