写点什么

Java 之 JNI 初步认识

发布于: 2021 年 11 月 07 日

3、利用 javah -jni 命令把 HelloJNI.class 生成头文件,如:com_java_jni_HelloJNI.h ?(注意如果有包的关系存在的时候,javah -jni com.java.jni.HelloJNI)


接下来就是写 C 程序代码了,我们可以看到在生成 的 HelloJNI.h 头文件中,也声明了我们刚刚在 HelloJNI.java 里用 native 声明的所有函数,我们这里写 C 代码就必须实现这些头文件中声明了的函数


4、在 eclipse 或 vs 创建一个 C 工程,把刚刚生成的 HelloJNI.h 文件拷贝到工程目录,并导入,接下来再创建一个 C 程序,根据头文件里的方法声明写方法实现。



C 代码:


#include <stdio.h>


#include <stdlib.h>


#include "jni.h"


#include "com_java_jni_HelloJNI.h"


/*


  • Class: com_java_jni_HelloJNI

  • Method: sayHello

  • Signature: ()Ljava/lang/String;


*/


JNIEXPORT jstring JNICALL Java_com_java_jni_HelloJNI_sayHello


(JNIEnv *env, jobject obj){


printf("hello c");


}


5、方法实现之后,你会发现 C 程序提示有错,那是因为在方法实现的时候,许多字段没有声明,系统不认识,那就需要包含 jdk 给我们提供的一个数据转换的接口(存在于 jdk 目录下面的 include/jni.h 文件中),把 jni.h 文件拷贝到 C 工程的根目录,在 C 程序中包含 jn


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


i.h 如下:


#include"jni.h",这个时候,我们不能用"<jni.h>"了(自己理解区别),其实我们在自动生成的 com_java_jni_HelloJNI.h 文件中也是使用 #include<jni.h>,这样同样系统会提示出错,所以也必须改过来



6、编译生成 dll 或 so 文件,用 vs 的话,在创建的时候,需要选择 dll 和空工程,这样在 build 的时候,在 debug 下面会生成一个 dll 文件 ,这就是我们需要的动态链接库文件


如果我们使用的是 eclipse 这时候,我们可以用命令来编译:


我用的是 eclipse+minGW,所以这里我们用 gcc 命令来编译:进入到 C 程序所在的目录然后用下面命令来编译


gcc --share -Wl,--kill-at -o HelloJNI.dll HelloJNI.c ?


或者


gcc --share -o HelloJNI.dll HelloJNI.c


注意这个命令不能用任何空格,开始的时候我就是在--kill-at 前面有一个小小空格,找死我了,呵呵……


7、这样我们在 C 程序所在的目录下面得到了我们需要的 dll 文件,动态链接库文件


8、将生成的 dll 文件加入到环境变量中,或创建的 java 工程目录中,用 System.loadLibrary("dll 文件名,不包含后缀");放在 static 块中,加载 dll 文件。这样我们就可以像调用 java 方法一样调用被 native 声明的方法了,当然实际运行的是我们在 C 程序中实现了的代码。代码如下:


package com.java.jni;


public class HelloJNI {


public native String sayHello();


static {

评论

发布
暂无评论
Java之JNI初步认识