eclipse中JNI实战

1.何为JNI?

JNI是JAVA标准平台中的一个重要功能,它弥补了JAVA的与平台无关这一重大优点的不足,在JAVA实现跨平台的同时,也能与其它语言(如C、C++)的动态库进行交互,给其它语言发挥优势的机会。有了JAVA标准平台的支持,使JNI模式更加易于实现和使用

这里不再赘述,附上别人总结的图:

原图链接:http://www.cnblogs.com/mandroid/archive/2011/06/15/2081093.html

知识补充:

存根类(stub),它实现了一个接口,但是实现后的每个方法都是空的。

它的作用是:如果一个接口有很多方法,如果要实现这个接口,就要实现所有的方法。但是一个类从业务来说,可能只需要其中一两个方法。如果直接去实现这个接口,除了实现所需的方法,还要实现其他所有的无关方法。而如果通过继承存根类就实现接口,就免去了这种麻烦。

头文件

百度解释:一般会把用来#include的文件的扩展名叫.h,称其为头文件。 #include文件的目的就是把多个编译单元(也就是c或者cpp文件)公用的内容,单独放在一个文件里减少整体代码尺寸;或者提供跨工程公共代码。

2 javah

使用Javah 可以获取您的 Java 源文件并生成 C/C++头文件,其中包含您的 Java
代码中所有本地方法(native方法)的 JNI 存根(stub,C头文件)。

3.eclipse配置javah


JNI的编写步骤

a、编写带有native声明的方法的java类

b、使用javac命令编译a中实现的类

c、javah -jni java类名生成扩展名为h的头文件

d、使用C/C++实现本地方法

e、将d中的本地方法生成动态链接库

首先新建一个包含本地方法(native方法)的类,native标识符暗示这些方法是有实现体的,只不过这些实现体是非java的,代码如下:

/**
 * 
 */
 package com.magc.jni;

 /**
 * @author magc
 *
 */
 public class HelloWorld {
    
    static {
        
        System.loadLibrary("Hello");
        
    }

    public     native void DisplayHello();
    /**
     * @param args
     */
    public static void main(String[] args) {

        new HelloWorld().DisplayHello();
    }

}

注:

loadloadLibrary区别

  1. 它们都可以用来装载库文件,不论是JNI库文件还是非JNI库文件。在任何本地方法被调用之前必须先用这个两个方法之一把相应的JNI库文件装载。

    2.System.load
    参数为库文件的绝对路径,可以是任意路径。
    例如你可以这样载入一个windows平台下JNI库文件:
    System.load("C:\\Documents
    and Settings\\TestJNI.dll");

    3. System.loadLibrary
    参数为库文件名,不包含库文件的扩展名。
    例如你可以这样载入一个windows平台下JNI库文件
    System. loadLibrary
    ("TestJNI");

    这里,TestJNI.dll
    必须是在java.library.path这一jvm变量所指向的路径中。
    可以通过如下方法来获得该变量的值:
    System.getProperty("java.library.path");
    默认情况下,在Windows平台下,该值包含如下位置:
    1)和jre相关的一些目录
    2)程序当前目录
    3)Windows目录
    4)系统目录(system32)
    5)系统环境变量path指定目录。

classpath与java.library.path区别

classpath路径下,只能是jar或者class 文件,否者会报错,因为他们会被load到JVM

要想java程序找到共享库还是要在执行java程序的时候指定java.library.path,用eclipse的话可以设置如下:

  1. Properties->Run/Debug settings->Arguments->VM arguments
  2. -----------------------------------------
  3. -Djava.library.path=/home/miaoyachun/workspace/JNIC/Release

需要使用外部工具,在我们运行java程序按钮的旁边,或者通过菜单栏上的run选项进入External
tool中并选择 External tool configuration,新建一个启动项HelloWorld

参数如下:

Location:

D:\program
files\Java\jdk1.7.0_51\bin\javah.exe

Working Directory

${project_loc}

Arguments:

-v -classpath "${project_loc}/bin" -d
"${project_loc}/jni" ${java_type_name}  (这里v表示启用详细输出)

4.生成实现函数头文件(扩展名为h)

运行该工具,光标必须定位在在需要生成头文件的java源文件中,否则会报${project_loc}这个变量为空错误

在当前项目的jni目录下生成了com_magc_jni_HelloWorld.h头文件,此文件供C、C++程序来引用并实现其中的函数

/* DO NOT EDIT THIS FILE - it is machine generated */
#include 
<jni.h>
/* Header for class com_magc_jni_HelloWorld */
#ifndef _Included_com_magc_jni_HelloWorld
#define 
_Included_com_magc_jni_HelloWorld
#ifdef __cplusplus
extern "C" 
{
#endif
/*
 * Class:     com_magc_jni_HelloWorld
 * Method:    
DisplayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL 
Java_com_magc_jni_HelloWorld_DisplayHello
  (JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif

注:1)、此头文件是不需要用户编译的,直接供其它C、C++程序引用。

2)、此头文件中的Java_com_magc_jni_HelloWorld_DisplayHello(JNIEnv *, jobject)方法,是将来与动态链接库交互的接口,并需要名字保持一致。

5.使用C/C++实现本地方法生成动态链接库(windows下扩展名为DDL,linux下扩展名为so):


#include <jni.h>
#include "com_magc_jni_HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_com_magc_jni_HelloWorld_DisplayHello
(JNIEnv *env, jobject obj)
{
    printf("From jni_helloworldImpl.cpp :");
    printf("Hello world ! \n");
    return;
}

此C++文件实现了上述头文件中的函数,注意方法函数名要保持一致。

编译生成动态链接库文件,有了具体实现的动态库,拷贝到项目的bin目录下,就可以运行JAVA调用JNI程序类的native方法了

时间: 2024-10-27 07:07:13

eclipse中JNI实战的相关文章

在Eclipse中设置进行JNI的头文件编译方法(转 http://blog.csdn.net/mirkerson/article/details/17187109)

这两天在搞NDK开发,JNI的头文件进行编译的时候,要跑到对应的class文件路径下(通常是工程的bin目录),进行编译生成,很是不便,也容易出错,所以考虑在Eclipse中作为外部工具引入,所以便查了下资料,现记录下来. 方法是: 1.在Eclipse环境下,打开下图中的最右边那个按钮. 2.新建一个Program,写上名字比如“javaH”,然后填写下面几项内容: 2.1.Location:把JDK下面的javaH.exe的全路径填进来. 2.2.Working Directory: Jav

JNI在eclipse中出现Unresolved inclusion: &lt;jni.h&gt;或Type &#39;jint&#39; could not be resolved等解决方法

在eclipse中经常出现这类错误,include文件报错或者是jint,jclass,JNIEnv could not be resolved等,但可以编译通过,可以经过这个步骤消除这些错误或警告 1. 打开.project,删除cdt部分 <buildSpec> <buildCommand> <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name> <triggers>cl

Java中JNI的使用详解第一篇:HelloWorld

今天开始研究JNI技术,首先还是老套路,输出一个HelloWorld:具体流程如下:在Java中定义一个方法,在C++中实现这个方法,在方法内部输出"Hello World",然后再回到Java中进行调用.分为以下步骤: 第一步:在Eclipse中建立一个类:JNIDemo 1 package com.jni.demo; 2 public class JNIDemo { 3 //定义一个本地方法 4 public native void sayHello(); 5 public sta

Maven常用命令及在Eclipse中的应用

1.常用命令 mvn archetype:generate--构建项目 mvn clean--项目清理 mvn test--项目单元测试的编译 mvn compile--项目源代码的编译 mvn package--项目打包 mvn install--发布项目提交到本地仓库 mvn deploy--发布项目到 mvn jetty:run--启动jetty容器 mvn eclipse:clean--清除eclipse的一些系统设置 mvn eclipse:eclipse--生成eclipse项目文件

在 Eclipse 中使用 NDK

自定义 Eclipse 使用 Eclipse IDE 的好处之一是很少需要编译.每次在 Eclipse IDE 中保存文件时,就会自动构建项目.这非常适用于 Android SDK(即 Java)文件和 Android XML 文件,但是对于 NDK 构建的库来说怎么样呢?我们来了解一下. 扩展 Eclipse 环境 如前所述,构建本地库和运行 ndk-build 命令一样简单.但是,除了简单的练习外,当处理其他任何项目时,像下面这样做会很麻烦,即跳出终端或命令窗口并执行 ndk-build 命

cygwin+ndk+eclipse下JNI技术入门

1.JNI的编写步骤1)编写带有native 声明的java类.2)编译java文件成class类3)使用javah -jni com.ikags.project.XXXX 编译成.h文件4)使用C/C++编写代码5)编写makefile文件,将.h和.c(.cpp)文件编译成.dll(.so)文件6)将.dll(.so)文件提供给项目,用system.loadLibrary方法调用. 2.编写makefile文件make执行时,自动寻找Makefile(makefile)文件,然后执行编译工作

Android项目中JNI技术生成并调用.so动态库实现详解

生成 jni方式有两种:一种是通过SWIG从C++代码生成过度的java代码:另一种是通过javah的方式从java代码自动生成过度的C++代码.两种方式下的步骤流程正好相反. 第一种方式:由于需要配置SWIG环境,有点麻烦了,所以往往大家不采用这个途径,参照博文http://my.oschina.net/liusicong/blog/314162. 第二种方式:javah的方式则通过shell指令就可以完成整个流程,该过程大概包括以下步骤: 编写 Java 代码.我们将从编写 Java 类开始

cocos2d-x分别在Visual Studio和eclipse中设置启用Box2D

cocos2d-x内嵌有chipmunk和Box2D两个物理库,默认启用的是chipmunk.如果想使用Box2D,可做如下设置.PS:本人所用的版本是cocos2d-x-2.2.5. 一.在Visual Studio中设置启用Box2D. 一般通过cocos2d-x主目录下的tools/project-creator/文件夹下的python命令创建一个工程,并打开该工程后,相关的库也会随之导入Visual Studio.设置如下: 1.选中工程,按Alt + Enter快捷键(或者右键,选Pr

超详细Eclipse中导入XUtils3

XUtils3是一款Android开发框架,虽然框架使用对于老鸟来说很容易,但对于新手有种如履薄冰的感觉,下面是我整理的新手教程,在Eclipse中导入XUtils3,希望能帮助到新手. 前提:已配置好Android开发环境 1.开源地址        https://github.com/wyouflf/xUtils3.git    如果使用eclipse可以 点击这里下载aar文件, 点击进入 单机下载,然后用zip解压, 取出jar包和so文件,复制,放在独立的文件夹 将classes.j