「javajni博客」java博客园

博主:adminadmin 2023-01-24 04:09:08 250

今天给各位分享javajni博客的知识,其中也会对java博客园进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

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博客园的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。