JNI--基本介绍和使用

JNI全名为:Java Native Interface,用于连接Java和C/C++桥梁,通过JNI,Java语言可以调用C/C++的函数,反之C/C++也可以调用Java的变量和方法,一般使用环境为:当Java满足不了程序的需要,如算法、图像渲染等高性能消耗操作时,需要访问一些C/C++代码提高性能
NDK:工具的集合。帮助开放者快速开放C/C++ 动态库的工具。开发JNI不是必须使用NDK,它只不过方便我们使用而已
下面介绍JNI的基本使用:
1.由于考虑到安卓开发人员只有AS工具,这边就使用AS新建一个项目,并创建一个带有main函数的类:
package com.aruba.jniapplication;

public class JniDemo {

    public static native String getStringFromC();

    public static void main(String[] args) {

    }
}
2.编写native方法
/**
     * 调用C++语言获取一个字符串
     * @return
     */
    public static native String getStringFromC();
在cmd中执行javah命令,注意!!要切换目录到主包名下,我这边包名是com.aruba.jniapplication,所以我需要在存放com文件夹的目录下执行
javah.png
生成了.h文件
h文件.png
3.编写C/C++代码之前,我们需要做一些准备操作

1.将jni.h 和jni_md.h复制到编译C/C++的环境

jni.h目录.png
jni_md.h目录.png

使用visual studio新建一个项目,并把两个.h文件放入,由于vs默认使用连接,不会复制文件到自己的项目中,所以我们手动把文件拷贝到vs的项目中,再通过右击-添加现有项的方式添加.h文件


2.将我们生成的.h文件也放入编译环境,名字可以随意修改
4.C++比C使用起来方便,所以我们现在开始在jni目录下编写C++代码

新建一个myJni.cpp

#include "my_jni.h"
#include <string>

using namespace std;

JNIEXPORT jstring JNICALL Java_com_aruba_jniapplication_JniDemo_getStringFromC
(JNIEnv* env, jclass jclz) {
    //新建一个string对象
    string s = "hello form C++";
    jstring jstr = env->NewStringUTF(s.c_str());
    return jstr;
}
5.生成动态库
将配置管理器中的平台修改成64位
.png
.png
右击项目,进入属性
改为生成动态库
点击上面菜单栏的生成,选择重新生成解决方案
最后成功生成动态库
将生成的dll复制到我们的AS项目中
image.png
6.Java中加载动态库,调用native方法
public class JniDemo {

    static {
//        System.out.println(System.getProperty("java.library.path"));
        System.load("C:\\Users\\tyqhc\\Documents\\workspace\\JniApplication\\app\\src\\main\\java\\com\\aruba\\jniapplication\\myJni.dll");
//        System.loadLibrary("myJni");
    }
    
    public static native String getStringFromC();

    public static void main(String[] args) {
        System.out.print(getStringFromC());
    }
}
System.load方法需要传入绝对路径,我们来运行看下效果:
JNI的具体使用流程就这么些,之后会再介绍静态native函数和非静态native函数的区别,以及C/C++调用Java中的变量等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值