「javajni博客」java博客园
今天给各位分享javajni博客的知识,其中也会对java博客园进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、JAVA 里面如何 使用jni 给个例子 加 解释。谢谢
- 2、Java 运行时JNI问题
- 3、java博客网站有哪些
- 4、android 如何Java code 得到 Include 对象
- 5、java 调用动态链接库(jni方式调用dll文件)
- 6、请问jni技术到底是什么?能不能简单的阐述一下?
JAVA 里面如何 使用jni 给个例子 加 解释。谢谢
JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。
JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法。
简单介绍及应用如下:
一、JAVA中所需要做的工作
在JAVA程序中,首先需要在类中声明所调用的库名称,如下:
static {
System.loadLibrary(“goodluck”);
}
在这里,库的扩展名字可以不用写出来,究竟是DLL还是SO,由系统自己判断。
还需要对将要调用的方法做本地声明,关键字为native。并且只需要声明,而不需要具 体实现。如下:
public native static void set(int i);
public native static int get();
然后编译该JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就会生成C/C++的头文件。
例如程序testdll.java,内容为:
public class testdll
{
static
{
System.loadLibrary("goodluck");
}
public native static int get();
public native static void set(int i);
public static void main(String[] args)
{
testdll test = new testdll();
test.set(10);
System.out.println(test.get());
}
}
用javac testdll.java编译它,会生成testdll.class。
再用javah testdll,则会在当前目录下生成testdll.h文件,这个文件需要被C/C++程序调用来生成所需的库文件。
二、C/C++中所需要做的工作
对于已生成的.h头文件,C/C++所需要做的,就是把它的各个方法具体的实现。然后编译连接成库文件即可。再把库文件拷贝到JAVA程序的路径下面,就可以用JAVA调用C/C++所实现的功能了。
接上例子。我们先看一下testdll.h文件的内容:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include jni.h
/* Header for class testdll */
#ifndef _Included_testdll
#define _Included_testdll
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: testdll
* Method: get
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass);
/*
* Class: testdll
* Method: set
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);
#ifdef __cplusplus
}
#endif
#endif
在具体实现的时候,我们只关心两个函数原型
JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass); 和
JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);
这里JNIEXPORT和JNICALL都是JNI的关键字,表示此函数是要被JNI调用的。而jint是以JNI为中介使JAVA的int类型与本地的int沟通的一种类型,我们可以视而不见,就当做int使用。函数的名称是JAVA_再加上java程序的package路径再加函数名组成的。参数中,我们也只需要关心在JAVA程序中存在的参数,至于JNIEnv*和jclass我们一般没有必要去碰它。
好,下面我们用testdll.cpp文件具体实现这两个函数:
#include "testdll.h"
int i = 0;
JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass)
{
return i;
}
JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint j)
{
i = j;
}
编译连接成库文件,本例是在WINDOWS下做的,生成的是DLL文件。并且名称要与JAVA中需要调用的一致,这里就是goodluck.dll 。把goodluck.dll拷贝到testdll.class的目录下,java testdll运行它,就可以观察到结果了。
Java 运行时JNI问题
1、在执行java的时候,要输入完整的包名+类名。否则在以后的测试调用过程中会发生java.lang.UnsatisfiedLinkError这个异常。
2、错误的详细信息。
3、CLASSPATH、PATH。
4、写入程序出现问题
Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
java博客网站有哪些
Java Specialists:
技术小黑屋 :专注Android和Java技术分享。
优就业吧-百度贴吧:优就业
Java - 博客园 :
HowToDoInJava - Popular Java Technology Blog :
IT资讯,互联网新闻:
CSDN-专业IT技术社区:
android 如何Java code 得到 Include 对象
include不是一个对象,它只是一条预处理指令,通过这指令你就可以使用C/C++函数库中的函数。如:
!--#include “头文件名”--
java要调用C/C++的函数库中的函数的话,可以通过JNI(java本地接口)来实现。
介绍一下简单的流程:
1、首先在java中申明一个本地的方法(Native修饰),不要去实现这个方法。
2、接着通过javah命令编译这个java文件,生成一个扩展名为.h的头文件,在这个头文件中编译器会自动为你申明一个跟你在java中申明的本地方法相对应的一个函数。
3、然后创建一个.c或者.cpp的文件,在里面实现第三步生成的那个函数,在这个文件中需要将第三步的那个头文件include进来。
4、再使用gcc(在linux下)或者其他方法将你实现的本地代码生成动态链接库也叫做共享库。以前做windows开发的人都知道动态链接库.dll,但是android是基于linux,在linux有一扩展名为.so的文件,它其实跟在windows中的dll库文件差不多,这一步就是生成.so文件。
5、你需要在你的java程序中加载这个库文件(.so文件),比如:
System.load(你的库文件路径);
你就可以在你的程序其他地方调用在第一步申明的那个本地方法了。
6、最后就是运行java程序。
举个在java中的代码的例子:
public class MyJNI{
static {
try{
System.load("/home/Jni/test.so");//也可以使用loadLibrary方法,区别的话你可以去百度一下
}catch(UnsatisfiedLinkError e){Log.e("JNI",e.toString());}//抛出找不到对应的本地语言定义的异常
}
public static native String method_name(int params);//申明本地方法,这些参数返回值都是根据自己需要定义的
public String usingNativeMethod(int x){
method_name(x); //跟普通成员函数一样调用
}
}
详细的如何使用JNI可以参考一些专业的博客。
java 调用动态链接库(jni方式调用dll文件)
jni 是由Java调用C/C++的动态链接库 (DLL)。
所以把.class--.h--dll ,想法是不正确的,
同时也违背了Jni的初衷。
Dll是由C/C++生成的。
以前的一个项目用到了Java调用C/C++的DLL,所以对这个还算熟悉。
那个dLL是由C++程序员写的,在Microsoft Visual C++ 6.0编辑器中可以生成。然后由Java程序员用JNI来调用DLL里面实现的功能(方法)。
请问jni技术到底是什么?能不能简单的阐述一下?
jNi就是java调用本地方法的技术,最简单的来说,java运行一个程序需要要和不同的系统平台打交道,在windows里就是和windows平台底层打交道,mac就是要和mac打交道,jvm就是通过大量的jni技术使得java能够在不同平台上运行。而使用了这技术的一个标志就是native,如果一个类里的一个方法被native修饰,那就说明这个方法是jni来实现的,他是通过本地系统api里的方法来实现的。当然这个本地方法可能是c或者C++,当然也可能是别的语言。jni是java跨平台的基础,jvm通过在不同系统上调用不同的本地方法使得jvm可以在不同平台间移植。
当前你自己也可以用jni来写一些程序,这种基本上是你以前使用了其他语言完成了一些功能,但是你有要用java来重复这些功能的时候,就可以使用jni来完成了。不过带来的问题就是,如果你的那个本地方法是依托于本地操作系统的话,那就意味着你的java程序也只能在这一个系统上运行了。所以jni就使得java很容易限定在了一个系统平台上,而jdk的作用在于他提供一个规范,这个规范就是包含了很多native方法,这些方法都是要本地操作系统来实现的,而实现了这些本地方法的操作系统就可以移植java平台了。
关于javajni博客和java博客园的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。