ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Mac系统下JNI实现native方法(Java调用C语言的实现)-Demo

2019-03-08 16:03:44  阅读:483  来源: 互联网

标签:Java Demo HelloWorld C语言 动态链接库 jni include hello


转载自原文:https://blog.csdn.net/u010853261/article/details/53470514 

 

JNI实现native方法(Java调用C语言的实现)
JNI的实现步骤如下:
1. 编写带有native声明的方法的Java类
2. 使用javac命令编译编写的Java类
3. 使用java -jni **来生成后缀名为.h的头文件
4. 使用其他语言(C、C++)实现本地方法
5. 将本地方法编写的文件生成动态链接库

下面给出一个最简单的

1. 编写含有native方法的类:

public class HelloWorld{
    public native void hello();

    static {
        //设置查找路径为当前项目路径
        System.setProperty("java.library.path", ".");
        //加载动态库的名称
        System.loadLibrary("hello");
    }

    public static void main(String[] args){
        new HelloWorld().hello();
    }
}

2.编译代码:

$javac HelloWorld.java

这时就会生成HelloWorld.class文件

3. 使用java -jni **来生成后缀名为.h的头文件
根据上面的Java代码,调用jni命令

$javah -jni HelloWorld

这就会生成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: hello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_hello
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

4. 使用其他语言(C、C++)实现本地方法
这里创建HelloWorldImpl.c源文件实现功能:

#include "jni.h"
#include "HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloWorld_hello(JNIEnv *env,jobject obj){
printf("Hello World!\n");
return;
}

5. 将本地方法编写的文件生成动态链接库
使用命令生成动态链接库:

$gcc -dynamiclib -I /Library/Java/JavaVirtualMachines/jdk1.7.0_72.jdk/Contents/Home/include/ HelloWorldImpl.c -o libhello.jnilib

后面的那个libhello.jnilib就是生成的动态链接库;但是运行这个命令时报错了,显示:

In file included from HelloWorldImpl.c:1:
/Library/Java/JavaVirtualMachines/jdk1.7.0_72.jdk/Contents/Home/include/jni.h:45:10: fatal error:
'jni_md.h' file not found
#include "jni_md.h"
^
1 error generated.

提示jni_md.h这个文件找不到;我们执行下面的命令拷贝一份:

¥sudo cp /Library/Java/JavaVirtualMachines/jdk1.7.0_72.jdk/Contents/Home/include/darwin/jni_md.h /Library/Java/JavaVirtualMachines/jdk1.7.0_72.jdk/Contents/Home/include

后面在执行生成动态链接库的命令就成功了,下面图示最后的文件列表:


5.最后执行可执行文件

$ java HelloWorld 


得到运行结果。

6. 注意:
我们使用gcc生成的动态链接库;在Mac下的后缀是固定的,就是.jnilib。此外我们生成的动态链接库必须是以lib开头的,而且我们加载动态库时需要去掉前面的lib.比如上面的例子,生成的是libhello.jnilib,后面调用加载动态库时使用的是hello这个动态库名。


标签:Java,Demo,HelloWorld,C语言,动态链接库,jni,include,hello
来源: https://www.cnblogs.com/cnliang/p/10496248.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有