虚拟机下的JNI

对于别人写的linux下的jni写的真的不清晰、明了,甚至会出现错误;对于代码重点的就是不会的人用你的代码就可以执行就ok了!!好了,废话不说了,来开始咱们的jni了;

首先咱们得理解一下jni的概念吧: jni(java
native
interface)java原生接口;对于学习过java的我们并不陌生接口的概念吧,接口就是定义一系列的方法,让其实现类来实现;好了,咱们直接上代码,用代码来解决一切;

第一个程序:对于java类的属性赋值:

首先看看完成后的文件:

首先新建TestInt.java :


public class TestInt{

public native void setInt(int a);
public native int getInt();
static{
System.loadLibrary("TestInt");
}
public static void main(String args[]){

TestInt testInt = new TestInt();
testInt.setInt(5);
System.out.println("你要输出的值为:"+testInt.getInt());
}
}

然后进行编译:javac TestInt.java
生成TestInt.class计算机可以读取的二进制文件,依靠此二进制文件生成头文件 TestInt.h

指令为:javah -jni TestInt
 生成了TestInt.h文件:其代码如下:


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

#ifndef _Included_TestInt
#define _Included_TestInt
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: TestInt
* Method: setInt
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_TestInt_setInt
(JNIEnv *, jobject, jint);

/*
* Class: TestInt
* Method: getInt
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_TestInt_getInt
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

咱们可以看到这里有两个方法分别如上图代码所示:

咱们要在写一个c语言代码,来实现对于其方法的实现:说白了,其方法就是接口中要实现的方法:新建一个TestInt.cpp


#include<jni.h>
#include"TestInt.h"

int b;
JNIEXPORT void JNICALL Java_TestInt_setInt
(JNIEnv *env, jobject obj, jint a){
b=3+a;
}

JNIEXPORT jint JNICALL Java_TestInt_getInt
(JNIEnv * env, jobject obj){
return b;
}

ok!以上代码已经完成,接下来就是要生成动态库了:

g++ -I/usr/java/jdk1.6.0_43/include/linux
-I/usr/java/jdk1.6.0_43/include -fpic -shared -o libTestInt.so TestInt.cpp

如果你要是这样写:   g++
 -fpic -shared -o libTestInt.so TestInt.cpp会抛出如下异常:


TestInt.cpp:1:16: 错误:jni.h:没有那个文件或目录
TestInt.h:15: 错误:expected constructor, destructor, or type conversion before ‘void’
TestInt.h:23: 错误:‘JNIEXPORT’ 没有命名一个类型
TestInt.cpp:5: 错误:expected constructor, destructor, or type conversion before ‘void’
TestInt.cpp:10: 错误:‘JNIEXPORT’ 没有命名一个类型

所以必须要指明jdk的头文件的路径,以及include目录下其他资源文件的路径;

最后一条指令:java Djava.dictionary.path=.
TestInt

输出结果:你要输出的值为:8

另外一个程序:关于无返回值字符串的输出程序:

首先也一样将结果目录图片显示出来:

我也不那么多废话了:直接将各个文件的代码复制到页面:


public class TestJni{

public native void print(String context);

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


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

#ifndef _Included_TestJni
#define _Included_TestJni
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: TestJni
* Method: print
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_TestJni_print
(JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif


#include <jni.h>
#include "TestJni.h"
JNIEXPORT void JNICALL Java_TestJni_print
(JNIEnv *env, jobject obj, jstring content){

const jbyte *str=( const jbyte *)(*env)->GetStringUTFChars(env,content,JNI_FALSE);
printf("Hello,%s\n",str);
(*env)->ReleaseStringUTFChars(env, content, (const char *)str );
}


public class HelloWorld{

public static void main(String args[]){

new HelloWorld();
}
public HelloWorld(){
new TestJni().print("yuchao");
}
}

各个操作过程第一个程序写的很清楚了,所以这里我就不写了;

时间: 2024-10-26 18:17:36

虚拟机下的JNI的相关文章

VMWare虚拟机下RedHat 9.0linux的网络设置

VMWare虚拟机下安装的RedHat 9.0 linux有三种方式实现上网,桥接.nat.host-only.本来想用桥接方式的,可总是因为配置网络出现问题而不能上网,还把 sygate4.5(代理服务器软件)给安装上去配置也没用.没办法 ,还是用nat方式去配置,虚拟机linux下NAT上网配置和我用的windows xp3不一样,linux要想用NAT方式上网还需进行另外的设置,试了N多遍,最后才发现,我把linux的DNS配置错了,真想哭啊,这点小错误浪费 了我这么多时间.不废话了,还是

外网主机访问虚拟机下的web服务器(NAT端口转发)

主机:系统win7,ip地址172.18.186.210 虚拟机:VMware Workstation 7,虚拟机下安装了Centos操作系统,ip地址是192.168.202.128,部署了LAMP,成为一个web服务器 网络环境:校园网(有认证服务器,需要账号认证才能上网),虚拟机采用NAT的方式联网 在校园网的环境下,可以把校园网内的其他主机看成是外网的主机.其实,虚拟机采用NAT联网的方式,可以让我们联想到计算机网络的相关知识,可以把我们的主机看成是一部路由器,然后虚拟机就是处在一个局域

VMware虚拟机下Linux系统的全屏显示

在VMware虚拟机下的Linux无法全屏的问题的解决方案如下: 1.   启动虚拟机,并启动Redhat6.4. 2.   点击“view”——然后将Autofit window这个选项勾选.(一般版本高的VMware虚拟机都会默认该设置). 3.   该步骤是关键,具体的操作为:点击“虚拟机”,选中“install vmware-tools”选项. 4.   接下来的操作都是在虚拟机中的Linux中进行: (1)打开linux的cdrom看是否有VMware Tools 的文件,如果有则说明

XE6移动开发环境搭建之IOS篇(5):解决Windows和虚拟机下Mac OSX的共享问题(有图有真相)

XE6移动开发环境搭建之IOS篇(5):解决Windows和虚拟机下Mac OSX的共享问题(有图有真相) 2014-08-20 20:28 网上能找到的关于Delphi XE系列的移动开发环境的相关文章甚少,本文尽量以详细的内容.傻瓜式的表达来告诉你想要的答案. 在安装XE6 PAServer前,我们先解决Windows和虚拟机下Mac的文件共享问题,由于虚拟机和我们安装的XE6是同一台电脑,所以此问题很好解决.网上相传有很多的共享大法,但是在WIN7这种权限管制得过份的系统下显得相对复杂了,

在虚拟机下安装ubuntu 10.04 64bit,并修改root用户密码

实验的环境: 笔记本是:HP 虚拟机:VMware  9 准备安装的操作系统: ubuntu 10.04  64bit 实验步骤: 一:让自己的hp支持虚拟化技术(由于ubuntu 10.04  64bit需要CPU支持虚拟化技术,所以要通过bios来更改电脑的默认设置) 启动时根据提示按 Esc 键 按 F10 键以配置 BIOS 使用箭头键滚动到"System Configuration" 选择"Virtualization Technology",然后按 En

VMware虚拟机下安装RedHat Linux 9.0

从这一篇文章开始我和大家一起学习Linux系统.不管是什么样的系统,必须安装上才能谈使用对吧. Linux版本 安装Linux之前需要了解一下Linux系统的安装版本. Linux的版本分为内核版本和发行版本. 内核版本: 内核版本是由Linux领导小组控制的. 内核提供了一个在裸设备与应用程序间的抽象层. 现在最新的版本为2.6.24 发行版本: 仅有内核而没有应用软件的操作系统是无法使用的,所以许多公司将内核.源代码以及相关的应用程序组织成一个完整的操作系统,这就是发行版本.它们的发行版本号

在Win7虚拟机下搭建Hadoop2.6.0伪分布式环境

近几年大数据越来越火热.由于工作需要以及个人兴趣,最近开始学习大数据相关技术.学习过程中的一些经验教训希望能通过博文沉淀下来,与网友分享讨论,作为个人备忘. 第一篇,在win7虚拟机下搭建hadoop2.6.0伪分布式环境. 1. 所需要的软件 使用Vmware 11.0搭建虚拟机,安装Ubuntu 14.04.2系统. Jdk 1.7.0_80 Hadoop 2.6.0 2. 安装vmware和ubuntu 略 3. 在ubuntu中安装JDK 将jdk解压缩到目录:/home/vm/tool

1虚拟机下U盘或磁盘挂载,Ubuntu下的网络配置,图形化界面和命令界面之间的切换,软件源配置

 一设置磁盘挂载(磁盘默认挂载到了/media目录下了) A:插入移动硬盘 B:对虚拟机进行设置(虚拟机->可移动设备àtoshibaExternal USB 3.0(这个是我的移动硬盘插上去之后显示的一项)à连接) 有时候出现以下现象 C:检测存储设备名称 sudofdisk –l E:挂载存储设备sdb1到挂载点/mnt目录下 sudomount /dev/sdb1 /mnt F:访问/mnt cd/mnt G:卸载/mnt sudo umount /mnt 二虚拟机下U盘或磁盘挂载,步

虚拟机下安装VM-TOOLS

点击VM10.0,虚拟机-安装VMware Toosl工具,在Linux桌面,看见光驱,双击,把VM Tools**.tar.gz文件复制到Root目录下. 打开Shell--即终端解压 tar -zxvf VM*.tar.gz cd vm* 执行批处理文件 ./vm*.pl 安装完成! 重启 reboot 即可实现鼠标的切换,及自适应分辨率. 虚拟机下安装VM-TOOLS,布布扣,bubuko.com