zoukankan      html  css  js  c++  java
  • java jni 编程

    最近要学习Java JNI 编程.

    我使用的是的windows系统。装了一个cygwin.

    根据 《JNI 编程规范和指南》. 文件网址: http://wenku.baidu.com/view/b52878ffaef8941ea76e0531.html 

    第一步: javac  HelloWorld.java 生成了 HellWorld.class    // 在cygwin 下执行命令

    第二步:javah -jni HelloWorld  生成了HelloWorld.h      // 在cygwin 下执行命令

    第三步:实现HelloWorld.c 这个文件   //用文本编译器写上代码

    第四步:生成HelloWorld.dll 这个文件,由于是在windows 系统所以要生成.dll文件。而不是 libHelloWorld.so 文件。

    一开始,我一直在cygwin下用 gcc -shared HelloWorld.c libHelloWorld.so 生成了 libHelloWorld.so ,但在运行时

    执行 java HelloWorld 时

    总是出下面的错误,我以为是cygwin 下是找HelloWorld.so的,其实是找HelloWorld.dll的.

    java.lang.UnsatisfiedLinkError: no HelloWorld in java.library.path
            at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1700)
            at java.lang.Runtime.loadLibrary0(Runtime.java:841)
            at java.lang.System.loadLibrary(System.java:1067)
            at HelloWorld.<clinit>(HelloWorld.java:7)
    Error: Could not find the main class.
    Error: A JNI error has occurred, please check your installation and try again
    Exception in thread "main"

    老说链接不了本地方法的库.

    于是我就用,命令行编译生成 HelloWorld.dll文件。但是老是编译通不过,生成不了HelloWorld.dll于是。

    我就用vc6 生成了 Helloworld.dll.

    打开VC6,: 文件--->新建-->win32 Dynamic-Link Library  选择新建一个动态链接库

    工程名: HelloWorld

    路径名:为你的代码路径

    然后新建一个空工程.完成后,把前面的 HelloWorld.c 和HelloWorld.h文件加入你的工程

    另外由于你的HelloWorld.c中包含了 <jni.h>.编译是会说找不到这个头文件,你需要做如下设置

    project setting-->c/C++/  在 分类:下拉列表中选择  预处理器

    然后 在附加包含路径那里,加入:

    你的jdk安装路径中的 include 路径,和include/win32 这两个路径,那里面有 <jni.h>这个头文件

    以及<jni_md.h> 

    我的加入路径如下:

    C:Javajdk1.7.0include,C:Javajdk1.7.0includewin32  

    编译成功后,会生成Helloworld.dll. 在你的工程目录的 debug文件夹中。

    然后把HelloWorld.dll 拷贝到你的 HelloWorld.class所在的目录。记住他们要在同一个目录下然后执行:


    java HelloWorld  这样就可以运行了.

    或者

    java -Djava.library.path=. HelloWorld  //这条命令先是指定 java本地库的搜索路么为当前路么,然后运行 HelloWorld 这个类.


    代码分别如下:

    ----- HelloWorld.java 文件----内容如下 :

    class HelloWorld{
    private native void print();
    public static void main(String[]  args){
    new HelloWorld().print();
    }
    static {
    System.loadLibrary("HelloWorld");
    }
    }

    ------HelloWorld.h-----内容如下

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


    #ifndef _Included_HelloWorld
    #define _Included_HelloWorld
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     HelloWorld
     * Method:    print
     * Signature: ()V
     */
    JNIEXPORT void JNICALL Java_HelloWorld_print
      (JNIEnv *, jobject);


    #ifdef __cplusplus
    }
    #endif
    #endif




    -----HelloWorld.c----如下:

    #include <jni.h>
    #include <stdio.h>
    #include "HelloWorld.h"
    JNIEXPORT void JNICALL Java_HelloWorld_print(JNIEnv *env, jobject obj)  
    {
    printf("Hello World! ");
    return;
    }  



  • 相关阅读:
    linux redis 安装和链接,,,
    ppt转化pdf
    跨服务器 同步数据
    字典表相关
    代码重构,空间换时间,dictionary 不要用object ,需明确指定类型
    stringbuilder for test performance 性能 update 性能
    nvarchar 和varchar 在len下一致,datalength下nvarchar翻倍
    android GradLayout实现计算器
    屏幕录制GIF动画工具
    android SharedPreferences 简单的数据存储
  • 原文地址:https://www.cnblogs.com/pangblog/p/3285813.html
Copyright © 2011-2022 走看看