【JNI笔记】手把手教你写Hello World

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/z2464342708m/article/details/80466107

【JNI笔记】手把手教你写Hello World

最近这些时间,学习状态不咋地,好久没有更新博客了,好在没几个人看我的博客。
这一期我就把学习JNI的笔记拿出来和大伙分享,从最简单的也是最经典的程序Hello World开始。
开发工具Eclipse,Visual Studio
先创建一个Java程序,目录结构如下:
这里写图片描述
1、创建Java项目;
2、编写native 方法;

public native static String helloWorldFromC();

3、生成.h头文件;
* 使用命令行,找到Main.java 目录;
* 使用命令javah Main生成头文件;
这里写图片描述
4、将.h文件拷贝到C项目中;
5、将.h文件添加到项目中;
这里写图片描述
到这里在我们的C项目会报一些错误:jni.h找不到,这个.h文件在我们jdk里面,把jni.h头文件导入到C项目中,然后这个头文件还是报错,需要把尖括号改成双引号,这样就没问题了。
6、编写C文件:

#include "stdafx.h"

#include "Mian.h"

JNIEXPORT jstring JNICALL Java_Mian_HelloWorldFromC(JNIEnv *evn, jclass jcls) {
    return (*evn)->NewStringUTF(evn,"Hello Wolrd");
}

ok,编码已经完成,试试生成一个动态库吧。
在生成动态库的时候需要配置一下:
* 配置解决方案平台;
* 项目属性->常规->项目默认值:把配置类型修改为动态库(.dll);
这里写图片描述
哎呀,不好意思,报错了:

严重性 代码  说明  项目  文件  行   禁止显示状态
错误  C1853   “x64\Debug\JNI06.pch”预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)    JNI06   d:\cprojects\jni06\jni06\helloworld.c   1   

解决:项目属性->C/C++->预编译头:把预编译头修改为:不使用预编译头,再次生成动态库试试。
这里写图片描述
7、将生成的动态库拷贝到java项目中,并在java项目中调用动态库方法:

public class Mian {

    public native static String helloWorldFromC();

    static {
        System.loadLibrary("JNI06");
    }

    public static void main(String... arg0) {
        System.out.println(helloWorldFromC());
    }

}

运行便可在控制台看到Hello Wolrd了。
最后附上源码:
Mian.h

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

#ifndef _Included_Mian
#define _Included_Mian
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Mian
 * Method:    helloWorldFromC
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_Mian_helloWorldFromC
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

HelloWorld.c

#include "stdafx.h"

#include "Mian.h"

JNIEXPORT jstring JNICALL Java_Mian_helloWorldFromC(JNIEnv *evn, jclass jcls) {
    return (*evn)->NewStringUTF(evn,"Hello Wolrd");
}

Mian.java

public class Mian {

    public native static String helloWorldFromC();

    static {
        System.loadLibrary("JNI06");
    }

    public static void main(String... arg0) {
        System.out.println(helloWorldFromC());
    }

}

猜你喜欢

转载自blog.csdn.net/z2464342708m/article/details/80466107