• linux下JNI开发—Hello为例


    转自:https://www.cnblogs.com/snake-hand/archive/2012/05/25/2517412.html

    前期准备:

    1、Java JDK

    2、gcc

    3、g++

    确保上述准备工作完成后开始下边的工作:

    Java代码:

    public   class  Hello {  
        static  {  
            try  {  
                System.loadLibrary("Hello" );              
            } catch  (UnsatisfiedLinkError e) {  
                e.printStackTrace();  
            }  
        }  
          
        public  Hello() {};  
          
        public   native   void  SayHello(String strName);  
    }
    

    在终端输入 javac Hello.java 后生成Hello.class 文件

    然后:javah Hello 生成 Hello.h文件

     

    然后在相同的目录下新建一个Hello.cpp文件:内容如下:

    #include "Hello.h"   
    #include <stdio.h>   
    // 与 Hello.h 中函数声明相同   
    JNIEXPORT void  JNICALL Java_Hello_SayHello  (JNIEnv * env, jobject arg, jstring instring)  
    {  
      // 从 instring 字符串取得指向字符串 UTF 编码的指针   
      const  jbyte *str =  
        (const  jbyte *)env->GetStringUTFChars( instring, JNI_FALSE );  
      printf("Hello,%s
    " ,str);  
      // 通知虚拟机本地代码不再需要通过 str 访问 Java 字符串。   
      env->ReleaseStringUTFChars( instring, (const   char  *)str );  
      return ;  
    }
    

    编译生成动态库

    gcc -I /usr/java/jdk1.8.0_73/include/ -I /usr/java/jdk1.8.0_73/include/linux/  Hello.cpp -fPIC -shared -o Hello.so
    

     注意

    /usr/java/jdk1.8.0_73/include/
    /usr/java/jdk1.8.0_73/include/linux/
    这两目录根据自己的java jdk的安装目录而变。

    所有文件

    Hello.class  Hello.cpp  Hello.h  Hello.java  Hello.so

    最后通知动态链接程序此共享文件的路径。

    export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH 

    最后是java测试代码:

    public   class  ToSay   
     {   
         public   static   void  main(String argv[])   
         {   
             ToSay say = new  ToSay();   
         }   
         public  ToSay()   
         {   
             Hello h = new  Hello();   
             // 调用本地方法向 John 问好   
             h.SayHello("John" );              
         }   
     }
    

     用 javac 编译 ToSay.java,生成 ToSay.class 
    向执行普通 Java 程序一样使用 java ToSay,我们会看到在屏幕上出现 Hello,John。 

     

  • 相关阅读:
    应用系统数据删除与恢复
    Java设计模式(八)Proxy代理模式
    Java设计模式(七)Decorate装饰器模式
    Java服务器端生成报告文档:使用SQL Server Report Service(SSRS)
    C#生成二维码,裁切边框
    Java ORM Hibernate 入门笔记
    Java JDBC MySQL
    Java JDBC SqlServer
    Java设计模式(六)Adapter适配器模式
    Java设计模式(五)Prototype原型模式
  • 原文地址:https://www.cnblogs.com/chaofn/p/9931813.html
Copyright © 2020-2023  润新知