Java中的native方法实现(Java混用C/C++)
来源:互联网 发布:淘宝绿森数码怎么样 编辑:程序博客网 时间:2024/05/18 02:26
前言
- native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中。Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI接口调用其他语言来实现对底层的访问。
- JNI是Java本机接口(Java Native Interface),是一个本机编程接口,它是Java软件开发工具箱(Java Software Development Kit,SDK)的一部分。JNI允许Java代码使用以其他语言编写的代码和代码库。Invocation API(JNI的一部分)可以用来将Java虚拟机(JVM)嵌入到本机应用程序中,从而允许程序员从本机代码内部调用Java代码。不过,对Java外部的调用通常不能移植到其他平台,在applet中还可能引发安全异常。实现本地代码将使您的Java应用程序无法通过100%纯Java测试。
实现步骤
1.书写一个Java类
public class HelloWorld { // 使用关键字native来声明方法 public native void displayInfor(String name); // 加载动态链接库 static { System.load("/Users/mac/Desktop/HelloWorldImpl.dylib"); } public static void main(String[] args) { HelloWorld helloWorld = new HelloWorld(); helloWorld.displayInfor("冯强"); }}
其中public native void displayInfor(String name);,声明了一个本地方法,有参数name,返回类型void。
System.load(“/Users/mac/Desktop/HelloWorldImpl.dylib”);表示加载一个本地动态链接库。
2.使用下javac命令编译该文件:
Macs-MacBook-Pro:Desktop mac$ javac HelloWorld.java
我们会看到生成了一个HelloWorld.class文件
3.使用javah命令处理HelloWorld.class文件
Macs-MacBook-Pro:Desktop mac$ javah -jni HelloWorld
这时候我们可以看到生成了一个HelloWorld.h文件:
4.打开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 __cplusplusextern "C" {#endif/* * Class: HelloWorld * Method: displayInfor * Signature: (Ljava/lang/String;)V */JNIEXPORT void JNICALL Java_HelloWorld_displayInfor (JNIEnv *, jobject, jstring);#ifdef __cplusplus}#endif#endif
其中:
JNIEXPORT void JNICALL Java_HelloWorld_displayInfor (JNIEnv *, jobject, jstring);
就是Java代码中对应的native方法,命名格式是 Java_类名_方法名(JNIEnv,jobject,这里是参数)。
5.修改HelloWorld.h文件中的#include
// 引入刚刚通过class文件生成的.h文件#include "HelloWorld.h"#include <stdio.h>#include <iostream>using namespace std;/* * Class: HelloWorld * Method: displayInfor * Signature: (Ljava/lang/String;)V */JNIEXPORT void JNICALL Java_HelloWorld_displayInfor(JNIEnv * env, jobject obj, jstring name) { cout<<"你好,"<<env->GetStringUTFChars(name, NULL)<<endl;}
8.使用g++处理HelloWorld.cpp生成动态链接库
Macs-MacBook-Pro:Desktop mac$ g++ -dynamiclib -o HelloWorldImpl.dylib HelloWorld.cpp
9.复制HelloWorldImpl.dylib文件的地址,放入到java文件中
System.load("/Users/mac/Desktop/HelloWorldImpl.dylib");
10.最终的文件如下:
11.运行Java程序
Macs-MacBook-Pro:Desktop mac$ java HelloWorld你好,冯强
其它
- 源码下载
关注下方公众号,回复:jni.code
欢迎加入交流群:451826376
更多信息:www.itcourse.top
阅读全文
0 0
- Java中的native方法实现(Java混用C/C++)
- JAVA中native方法调用C语言实现学习
- MFC实现C#,java中的Split方法
- java中的native方法
- java中的native方法
- Java中的native方法
- java中的Native方法
- java中的native方法
- java中的native方法
- java中的native方法
- java中的native方法
- Java中的native方法
- java中的native方法
- java中的native方法
- java中的native方法
- JAVA中的native方法
- java中的native方法
- java中的native方法
- HTML5新特性1(新表单控件/选择器/JSON/data)
- 手机直播APP源码开发-呆萌直播干货篇
- 64位ubuntu 兼容32位
- spring-boot集成mysql
- 蓝桥杯 算法训练 sign函数
- Java中的native方法实现(Java混用C/C++)
- 异步上传图片和文件同个页面可多个
- jQuery标准的AJAX模板
- OpenStack公共组件oslo之十四——pbr
- ehcache缓存
- 实验报告——Fanster RCNN训练project后的输电线路
- leetcode 398. Random Pick Index
- 杭电ACM OJ 1039 Easier Done Than Said? 水(但是很好玩的一道题,考察逻辑思维)
- ajax 跳入error的一些原因