JNI使用实例(Windows版本)自己实战演示过
来源:互联网 发布:重装系统桌面数据恢复 编辑:程序博客网 时间:2024/05/21 09:45
根据网上流传的JNI步骤实践了一把:
1) 编写java程序,声明本地方法:
D:\JavaIDE\JBuilder2007\workspace\Test_JAVA\jni\HelloJNI.java 程序如下
package jni;
public class HelloJNI {
public native void displayHello();
public native void showTime();
private native String getLine(String prompt);
static {
System.loadLibrary("hello");
}
public static void main(String[] args) throws Exception {
HelloJNI hj = new HelloJNI();
System.out.println("==> Demo 1: hello");
hj.displayHello();
System.out.println("==> Demo 2: time");
hj.showTime();
System.out.println("==> Demo 3: input");
String input = hj.getLine("Type a line: ");
System.out.println("User typed: " + input);
}
}
2)编译java文件,eclipse自动编译或者自己手动编译javac HelloJNI.java
3) 根据字节码生成头文件: javah jni.HelloJNI (注意要到项目源码根目录D:\JavaIDE\JBuilder2007\workspace\Test_JAVA上执行)
会在源码目录上生成头文件:jni_HelloJNI.h, 内容如下(无需自己修改):
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class jni_HelloJNI */
#ifndef _Included_jni_HelloJNI
#define _Included_jni_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: jni_HelloJNI
* Method: displayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_jni_HelloJNI_displayHello
(JNIEnv *, jobject);
/*
* Class: jni_HelloJNI
* Method: showTime
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_jni_HelloJNI_showTime
(JNIEnv *, jobject);
/*
* Class: jni_HelloJNI
* Method: getLine
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_jni_HelloJNI_getLine
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif
4)实现头文件中的方法:HelloJNIImpl.cpp
// HelloJNIImpl.cpp : Defines the entry point for the console application.
//
#include <jni.h>
#include <iostream>
#include <ctime>
#include <string>
#include <cstdio>
#include <windows.h>
#include "jni_HelloJNI.h"
extern "C" {
//
}
using namespace std;
JNIEXPORT void JNICALL Java_jni_HelloJNI_displayHello(JNIEnv * env, jobject obj) {
cout << "Hello, JNI tech. This is from C++!" << endl;
}
JNIEXPORT void JNICALL Java_jni_HelloJNI_showTime(JNIEnv * env, jobject obj) {
time_t sec;
tm t;
time_t loop;
cout << "时间:";
sec = time(NULL);
t = *localtime(&sec);
unsigned int hour = t.tm_hour;
unsigned int mini = t.tm_min;
unsigned int secd = t.tm_sec;
if(hour < 10) {
cout << "0" << hour;
}
else {
cout << hour;
}
cout << ":";
if(mini < 10) {
cout << "0" << mini;
}
else {
cout << mini;
}
cout << ":";
if(secd < 10) {
cout << "0" << secd;
}
else {
cout << secd;
}
cout << endl;
}
JNIEXPORT jstring JNICALL Java_jni_HelloJNI_getLine(JNIEnv * env, jobject obj, jstring prompt) {
char buf[128] = {0};
const char * str = (env)->GetStringUTFChars(prompt, 0);
// printf("%s", str);
cout << str;
(env)->ReleaseStringUTFChars(prompt, str);
string buffer;
getline(cin, buffer);
// scanf("%s", buf);
return (env)->NewStringUTF(buffer.c_str());
}
5)根据HelloJNIImpl.cpp生成dll文件:
用VC的命令行工具执行:
cl -I %JAVA_HOME%/include -I %JAVA_HOME%/include/win32 -LD D:/JavaIDE/JBuilder2007/workspace/Test_JAVA/HelloJNIImpl.cpp -Fe hello.dll
把生成的dll文件拷贝到D:\JavaIDE\JBuilder2007\workspace\Test_JAVA目录
6)测试
在D:\JavaIDE\JBuilder2007\workspace\Test_JAVA目录下运行字节码文件
java jni.HelloJNI
控制台输出:
==> Demo 1: hello
Hello, JNI tech. This is from C++!
==> Demo 2: time
时间:18:58:15
==> Demo 3: input
Type a line:
输入字符串后回显
1) 编写java程序,声明本地方法:
D:\JavaIDE\JBuilder2007\workspace\Test_JAVA\jni\HelloJNI.java 程序如下
package jni;
public class HelloJNI {
public native void displayHello();
public native void showTime();
private native String getLine(String prompt);
static {
System.loadLibrary("hello");
}
public static void main(String[] args) throws Exception {
HelloJNI hj = new HelloJNI();
System.out.println("==> Demo 1: hello");
hj.displayHello();
System.out.println("==> Demo 2: time");
hj.showTime();
System.out.println("==> Demo 3: input");
String input = hj.getLine("Type a line: ");
System.out.println("User typed: " + input);
}
}
2)编译java文件,eclipse自动编译或者自己手动编译javac HelloJNI.java
3) 根据字节码生成头文件: javah jni.HelloJNI (注意要到项目源码根目录D:\JavaIDE\JBuilder2007\workspace\Test_JAVA上执行)
会在源码目录上生成头文件:jni_HelloJNI.h, 内容如下(无需自己修改):
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class jni_HelloJNI */
#ifndef _Included_jni_HelloJNI
#define _Included_jni_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: jni_HelloJNI
* Method: displayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_jni_HelloJNI_displayHello
(JNIEnv *, jobject);
/*
* Class: jni_HelloJNI
* Method: showTime
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_jni_HelloJNI_showTime
(JNIEnv *, jobject);
/*
* Class: jni_HelloJNI
* Method: getLine
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_jni_HelloJNI_getLine
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif
4)实现头文件中的方法:HelloJNIImpl.cpp
// HelloJNIImpl.cpp : Defines the entry point for the console application.
//
#include <jni.h>
#include <iostream>
#include <ctime>
#include <string>
#include <cstdio>
#include <windows.h>
#include "jni_HelloJNI.h"
extern "C" {
//
}
using namespace std;
JNIEXPORT void JNICALL Java_jni_HelloJNI_displayHello(JNIEnv * env, jobject obj) {
cout << "Hello, JNI tech. This is from C++!" << endl;
}
JNIEXPORT void JNICALL Java_jni_HelloJNI_showTime(JNIEnv * env, jobject obj) {
time_t sec;
tm t;
time_t loop;
cout << "时间:";
sec = time(NULL);
t = *localtime(&sec);
unsigned int hour = t.tm_hour;
unsigned int mini = t.tm_min;
unsigned int secd = t.tm_sec;
if(hour < 10) {
cout << "0" << hour;
}
else {
cout << hour;
}
cout << ":";
if(mini < 10) {
cout << "0" << mini;
}
else {
cout << mini;
}
cout << ":";
if(secd < 10) {
cout << "0" << secd;
}
else {
cout << secd;
}
cout << endl;
}
JNIEXPORT jstring JNICALL Java_jni_HelloJNI_getLine(JNIEnv * env, jobject obj, jstring prompt) {
char buf[128] = {0};
const char * str = (env)->GetStringUTFChars(prompt, 0);
// printf("%s", str);
cout << str;
(env)->ReleaseStringUTFChars(prompt, str);
string buffer;
getline(cin, buffer);
// scanf("%s", buf);
return (env)->NewStringUTF(buffer.c_str());
}
5)根据HelloJNIImpl.cpp生成dll文件:
用VC的命令行工具执行:
cl -I %JAVA_HOME%/include -I %JAVA_HOME%/include/win32 -LD D:/JavaIDE/JBuilder2007/workspace/Test_JAVA/HelloJNIImpl.cpp -Fe hello.dll
把生成的dll文件拷贝到D:\JavaIDE\JBuilder2007\workspace\Test_JAVA目录
6)测试
在D:\JavaIDE\JBuilder2007\workspace\Test_JAVA目录下运行字节码文件
java jni.HelloJNI
控制台输出:
==> Demo 1: hello
Hello, JNI tech. This is from C++!
==> Demo 2: time
时间:18:58:15
==> Demo 3: input
Type a line:
输入字符串后回显
- JNI使用实例(Windows版本)自己实战演示过
- 四极管:Windows JNI 实例
- 【JNI】 Android JNI入门实例(Windows+Cygwin+Eclipse)
- Android studio使用JNI实例(1)
- JAVA JNI 使用实例
- JAVA JNI 使用实例
- JNI Windows 使用教程
- Android JNI入门实例(Windows+Cygwin+Eclipse)
- Android JNI入门实例(Windows+Cygwin+Eclipse)
- Android JNI入门实例(Windows+Cygwin+Eclipse)
- 【Android學習專題】Android JNI入门实例(Windows+Cygwin+Eclipse)
- html中的简单实例演示(checkbox)的使用
- Spring学习(六)实例演示Spring的使用
- RxJava实战演示1------基本代码使用
- fastdfs使用实战(Java实例篇)
- 使用Delphi实现JNI - 实例
- Android studio使用JNI实例
- Android Studio JNI使用实例
- 【CSS】左右布局,自适应宽高
- 基于51的DHT11驱动
- Eclipse设置、调优、使用
- . 和 ->区别
- C++类中的static数据成员,static成员函数
- JNI使用实例(Windows版本)自己实战演示过
- 深入MFC扩展DLL
- 集合类的基础概念
- gdb调试
- 数据库迁移之后查询特别慢的问题--重建索引
- android学习之——Handler消息传递机制
- poj2240--floryd算法变形
- opencv 视频转图像,图像转视频
- 动态语言和静态语言 | 强类型语言和弱类型语言