linux下JNI开发—HelloWord为例

转自: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("HelloWord" );
        } 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\n" ,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。 

原文地址:https://www.cnblogs.com/chaofn/p/9931813.html

时间: 2024-10-10 03:26:52

linux下JNI开发—HelloWord为例的相关文章

Linux下c开发 之 线程通信(转)

Linux下c开发 之 线程通信(转) 1.Linux“线程” 进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型.Linux是一种“多进程单线程”的操作系统.Linux本身只有进程的概念,而其所谓的“线程”本质上在内核里仍然是进程. 大家知道,进程是资源分配的单位,同一进程中的多个线程共享该进程的资源(如作为共享内存的全局变量).Linux中所谓的“线程”只是在被创建时clone了父进程的资源,因此clone出来的进程表现为“线程”,这一点一定要弄清楚.因此,L

linux下c++开发环境安装(eclipse+cdt)

方法一: 此外,众所周知,Eclipse是Java程序,因此很容易就实现了跨平台,也是众所周知,Java的大型程序非常吃内存,即使有512MB内存, 仍然感觉Eclipse的启动速度很慢.个人认为1GB内存是你工作效率的保证.其余的东西,需待我深入学习以后再进一步分析. 据网友的经验,先安装Eclipse Classic,然后再装CDT(C/C++ Development Tool),这样虽然体积大了一点但是方便日后添加Tool Kit. 在Ubuntu上安装Eclipse有两种方法:1. 使用

【转载】Visual Studio 2015 for Linux更好地支持Linux下的开发

原文:Visual Studio 2015 for Linux更好地支持Linux下的开发 英文原文:Targeting Linux Made Easier in Visual Studio 2015 Visual C++ for Linux 扩展使 Visual Studio 2015 的用户可以在 VS2015 中编写C或者 C++ 代码,并将代码部署到基于 Linux 的系统中去编译和调试.源代码和项目文件通过 SSH 传输到远程机上,程序的输出将显示在 Visual Studio 上.

linux下C++开发工具

就C++开发工具而言,与Windows下微软(VC, VS2005等)一统天下相比,Linux/Unix下C++开发,可谓五花八门,各式各样.Emacs, vi, eclipse, anjuta,kdevelop等层出不穷.Windows下,开发工具多以集成开发环境IDE的形式展现给最终用户.例如,VS2005集成了编辑器,宏汇编ml,C /C++编译器cl,资源编译器rc,调试器,文档生成工具, nmake.它们以集成方式提供给最终用户,对于初学者而言十分方便.但是,这种商业模式,直接导致用户

Linux下服务器端开发流程及相关工具介绍(C++)

原文:Linux下服务器端开发流程及相关工具介绍(C++) 去年刚毕业来公司后,做为新人,发现很多东西都没有文档,各种工具和地址都是口口相传的,而且很多时候都是不知道有哪些工具可以使用,所以当时就想把自己接触到的这些东西记录下来,为后来者提供参考,相当于一个路线图,帮助新人尽快上手. 本文介绍的是阿里妈妈搜索直通车这边的一些开发流程及相关工具.做为新人入门手册,其中某些工具可能只有直通车这边在用,但对于其他公司的新人来说,一样是具有指导意义的. 简单介绍一下直通车这边的开发背景:直通车业务对外是

构建Linux下IMX257 开发环境

构建Linux下IMX257 开发环境 2015-03-09 李海沿 一直以来玩开发IMX257都是使用Windows,然后就必须开一个超级卡的虚拟机,接着就是使用securecrt远程登录虚拟机中的linux和通过串口登录开发板的linux系统. 这里,我们来实现将所有的开发环境工作都转移至linux操作系统下,这下我们就不用饱受虚拟机导致的电脑卡的痛苦了. 接下来,我们不如正题: 在linux下,我们可以有两种方法来实现:minicom 和 C-kerimit两种方法. 我刚开始使用的是mi

linux下汇编语言开发总结

汇编语言是直接对应系统指令集的低级语言,在语言越来越抽象的今天,汇编语言并不像高级语言那样使用广泛,仅仅在驱动程序,嵌入式系统等对性能要求苛刻的领域才能见到它们的身影.但是这并不表示汇编语言就已经没有用武之地了,通过阅读汇编代码,有助于我们理解编译器的优化能力,并分析代码中隐含的低效率,所以能够阅读和理解汇编代码也是一项很重要的技能.因为我平时都是在linux环境下工作的,这篇文章就讲讲linux下的汇编语言. 一.汇编语法风格 汇编语言分为intel风格和AT&T风格,前者被Microsoft

android下jni开发总结

对于开发Android来说jni是一个相对应用得比较少的玩意(相对于Android系统来说),正好最近这一阵子公司的项目比较轻松有一定的空闲时间,就利用起来整理了一下android下jni开发常用到的知识点和一些比较重要的用法,发话不多说直接进入主题. 在这里,对于jni的一些基本的介绍我就不多说了感兴趣的可以去问度娘或者谷歌,我在这里主要是以代码为主讲解关于jni的主要用法,如果有什么遗漏或者错误的地方希望大家勿喷额.直接上代码来看看我定义的本地方法,域和方法名: <pre name="

(转)Linux下C++开发初探

1.开发工具 Windows下,开发工具多以集成开发环境IDE的形式展现给最终用户.例如,VS2008集成了编辑器,宏汇编ml,C /C++编译器cl,资源编译器rc,调试器,文档生成工具, nmake.它们以集成方式提供给最终用户,对于初学者而言十分方便.但是,这种商业模式,直接导致用户可定制性差,不利于自动化,集成第三方工具的能力弱.例如,无法定制一些宏来处理一些重复操作:体会不到自动化makefile一步到位快感:无法远程登录到服务器上进行开发:无法使用某种”粘合剂”来把第三方工具(例如,