学习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卡了我半天的时间吧,希望可以帮到你们