java 使用 jni

学习JNI

首先了解下jni

 jni:是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。简单的说就是Java Call C/C++  我要java要调用c库的方法.

 我这边是项目有个功能,接入第三方功能,把输入的文字转换成声波,通知到其他的设备上.在正常情况下app可以在本地完成数据转换,但因为产品需求,一定要在小程序实现,所以由服务器完成数据转换并生成音频url给到前端.

 具体代码我这边不公布了, 但有几点要注意,首先最好是让JNI调用动态库 就是 .dll 或者 .so,静态库我没试过.

	static {
		try{
			System.load("/usr/local/jni/libADT.so");
		}catch (Exception e){
			System.out.println("not fand file");
		}
	}
 下面以win环境为例(因为开发一般都在windows)

我们使用

System.load("");//绝对路径

System.loadLibrary("");//相对路径

调用so库
,这里指的是你的SO库是别人已经打包好可以直接使用的那种,包括路径和方法名称,

 如果没有怎么办呢?

我们开始学习HelloWorld JNI

首先写一个HelloWorld

public class HelloWorld {

    public native void sayHello();

    public static void main(String[] args) {
              // 加载动态链接库
        System.load("C:\\Users\\Administrator\\source\\repos\\helloWorld\\x64\\Release\\helloWorld.dll");
        HelloWorld hello = new HelloWorld();
        hello.sayHello();
    }
}
 先把main方法注释掉!!

 先把javac生成成class文件,再使用javah [class文件名] 生成.h文件(c的头文件)

向我们没有com.XXX的 找到class文件夹 直接输入cmd 进入dos命令窗然后 javah HelloWorld

就能生成.h文件了


/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class HelloWorld */

#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloWorld
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloWorld_sayHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif


生成头文件后我们就要开始写C的代码

C的代码

 
#include "HelloWorld.h"
using namespace std;
JNIEXPORT void JNICALL Java_HelloWorld_sayHello
(JNIEnv * env, jobject obj) {
	printf("aaa");
}



这里要注意jni.h和jni_md.h

这两个是java自带的 我们生成的HelloWorld.h文件会引用jni.h,jni.h会引用jni_md.h

 这两个文件的路径在我们安装java中就有 jni.h在java安装文件的include文件夹下面


而jni_md.h文件在win32文件夹中


这里要注意

打包的时候要根据你系统是32位还是64位

我这边是64位所以


这里一定要注 ,要不然打包出来的不能使用

然后我们会生成dll文件

最后我们把之前注释的java main代码给回复

然后在System.load()中把你的dll文件路径和文件名写死

启动试一下


这个样子就可以了

注意:

这个dll和so动态库需要c的环境 ,如果在windows打包好扔到linux执行不了或者说找不到文件

有可能是你的文件路径对应错误,或者系统C环境错误.

怎么说这个jni卡了我半天的时间吧,希望可以帮到你们

 









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值