要在java中调用c语言的库,需要使用Java提供了JNI。\x0d\x0a举例说明\x0d\x0a在c语言中定义一个 void sayHello()函数(打印Hello World)然后在Java中调用这个函数显示Hello Word.\x0d\x0a现在分别从Java和C语言两部分说明:\x0d\x0a1. Java 部分\x0d\x0a首先定义一个HelloNative,在其中申明sayHello函数,函数要申明为Native 类型的.如下:\x0d\x0apublic class HelloNative {\x0d\x0apublic native void sayHello()\x0d\x0a}\x0d\x0a\x0d\x0a编译这个类,生成class文件:\x0d\x0ajavac HelloWorld.java\x0d\x0a\x0d\x0a利用javah生成需要的h文件\x0d\x0ajavah HelloNative\x0d\x0a\x0d\x0a生成的 h文件大概如下:\x0d\x0a\x0d\x0a/* DO NOT EDIT THIS FILE - it is machine generated */\x0d\x0a#include \x0d\x0a/* Header for class HelloNative */\x0d\x0a\x0d\x0a#ifndef _Included_HelloNative\x0d\x0a#define _Included_HelloNative\x0d\x0a#ifdef __cplusplus\x0d\x0aextern "C" {\x0d\x0a#endif\x0d\x0a/*\x0d\x0a* Class: HelloNative\x0d\x0a* Method: sayHello\x0d\x0a* Signature: ()V\x0d\x0a*/\x0d\x0aJNIEXPORT void JNICALL Java_HelloNative_sayHello\x0d\x0a(JNIEnv *, jobject)\x0d\x0a\x0d\x0a#ifdef __cplusplus\x0d\x0a}\x0d\x0a#endif\x0d\x0a#endif\x0d\x0a\x0d\x0a可以看一下上面自动生成的程序,程序include了jni.h,这个头文件在 $JAVA_HOME下的include文件夹下. 还可以发现生成的函数名是在之前的函数名前面加上了Java_HelloNative。\x0d\x0a2. C语言部分\x0d\x0a根据上面生成的h文件编写相应的代码实现,建立一个 HelloNative.cpp用来实现显示Hello World的函数.如下:\x0d\x0a\x0d\x0a#include \x0d\x0a#include "HelloNative.h"\x0d\x0a\x0d\x0aJNIEXPORT void JNICALL Java_HelloNative_sayHello(JNIEnv *, jobject)\x0d\x0a{\x0d\x0aprintf("Hello World!\n")\x0d\x0a}\x0d\x0a\x0d\x0a代码编写完成之后,我们再用gcc编译成库文件,命令如下\x0d\x0agcc -fPIC -I/usr/lib/jvm/java-7-openjdk-i386/include -I/usr/lib/jvm/java-7-openjdk-i386/include/linux -shared -o libHelloNative.so HelloNative.cpp\x0d\x0a\x0d\x0a这样就会在当前目录下生成一个libHelloNative.so的库文件.这时需要的库已经生成,在C语言下的工作已经完成了.\x0d\x0a接下来需要在Java中编写一个程序测试一下.在程序前,需要将我们的库载入进去.载入的方法是调用Java的 System.loadLibrary("HelloNative")\x0d\x0a\x0d\x0apublic class TestNative\x0d\x0a{\x0d\x0astatic {\x0d\x0atry {\x0d\x0aSystem.loadLibrary("HelloNative")\x0d\x0a}\x0d\x0acatch(UnsatisfiedLinkError e) {\x0d\x0aSystem.out.println( "Cannot load hello library:\n " + e.toString() )\x0d\x0a}\x0d\x0a}\x0d\x0apublic static void main(String[] args) {\x0d\x0aHelloNative test = new HelloNative()\x0d\x0atest.sayHello()\x0d\x0a}\x0d\x0a}\x0d\x0a\x0d\x0a但是再编译后,运行的时候,问题又出现了.\x0d\x0aCannot load hello library:\x0d\x0ajava.lang.UnsatisfiedLinkError: no HelloNative in java.library.path\x0d\x0aException in thread "main" java.lang.UnsatisfiedLinkError: HelloNative.sayHello()V\x0d\x0aat HelloNative.sayHello(Native Method)\x0d\x0aat TestNative.main(TestNative.java:13)\x0d\x0a\x0d\x0a载入库失败,但是库明明就是放在当前文件夹下的,怎么会载入失败呢?\x0d\x0a用System.getProperty("java.library.path")查看,发现java.library.path中并不u存在当前的目录.主要有以下的几个解决办法:\x0d\x0a1) 将生成的库复制到java.library.path有的路径中去,当然这样不是很好\x0d\x0a2) 设置环境变量export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ,将当前的目录加入到LD_LIBRARY_PATH中\x0d\x0a3) 设置java 的选项,将当前的目录加入到其中 .java -Djava.library.path=. $LD_LIBRARY_PATH\x0d\x0a这样之后程序就能够成功的运行了.可以看见显示的"Hello World!"了Java Native Interface(JNI)是Java语言的本地编程接口,是J2SDK的一部分。在java程序中,我们可以通过JNI实现一些用java语言不便实现的功能。通常有以下几种情况我们需要使用JNI来实现。 标准的java类库没有提供你的应用程序所需要的功能,通常这些功能是平台相关的 你希望使用一些已经有的类库或者应用程序,而他们并非用java语言编写的 程序的某些部分对速度要求比较苛刻,你选择用汇编或者c语言来实现并在java语言中调用他们 下面我们开始编写HelloWorld程序,由于涉及到要编写c/c++代码因此我们会在开发中使用Microsoft VC++工具。编写java代码,我们在硬盘上建立一个hello目录作为我们的工作目录,首先我们需要编写自己的java代码,在java代码中我们会声明native方法,代码非常简单。如下所示 class HelloWorld { public native void displayHelloWorld()static { System.loadLibrary("hello")} public static void main(String[] args) { new HelloWorld().displayHelloWorld()} } 注意我们的displayHelloWorld()方法的声明,它有一个关键字native,表明这个方法使用java以外的语言实现。方法不包括实现,因为我们要用c/c++语言实现它。注意System.loadLibrary("hello")这句代码,它是在静态初始化块中定义的,系统用来装载hello共享库,这就是我们在后面生成的hello.dll(如果在其他的操作系统可能是其他的形式,比如hello.so) 编译java代码 javac HelloWorld.java 生成HelloWorld.class文件 创建.h文件 这一步中我们要使用javah命令生成.h文件,这个文件要在后面的c/c++代码中用到,我们运行 javah 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: displayHelloWorld * Signature: ()V */ JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject)#ifdef __cplusplus } #endif #endif 编写本地实现代码 在这部分我们要用C/C++语言实现java中定义的方法,我们在VC++中新建一个Project,然后创建一个HelloWorldImp.cpp文件,内容如下 #include <jni.h>#include "HelloWorld.h" #include <stdio.h>JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj) { printf("Hello world!\n")return} 注意我们这里include了 jni.h和刚才得到的HelloWorld.h文件。因此你要在VC++里面设置好,jni.h在JAVA_HOME/include里面。编译通过后再生成hello.dll文件。 运行java程序 把上面生成的hello.dll文件复制到我们的工作目录,这时候我们的目录中包括HelloWorld.java,HelloWorld.class和hello.dll文件。运行java HelloWorld命令,则可在控制台看到Hello world| 的输出了。运行VC++文件---新建---选“win32 console application”(控制台程序)---在右方设置好路径并输入工程名---确定 接下来的几个提示框点确定就行了,那是提示是否要用VC++提供的框架之类的 在左边的工作空间中选“FILEVIEW”标签项,点开“+”号,右键点击“SOURCE FILES”,选“添加文件到目录”,此即添加你要建立的C++源程序文件,会提示你没有文件,是否添加,你点是,输入文件名保存就OK了 然后SOURCE FILES下就出现了你刚才建立的*.CPP文件,双击,输入代码. 以下就是点”组建”菜单中的”编译”、”组建”等命令进行调试了。 相信你会了。 http://hi.baidu.com/%C7%E9%D4%B5and%D3%D1%D2%EA/blog/item/34084645e8560f23cefca3b7.html
java如何调用c语言源文件并执行?
给您推荐相同类型的内容:
数据结构c语言版视频教程
10《数据结构》【005】链接:https:pan.baidu.coms1jHDInT5qZOnvIZPjyVHOBQ提取码:2r91 复制这段内容后打开百度网盘手机APP,操作更方便哦!若资源有问题欢迎追问~05严蔚敏链接:C语言中如何实获取单向链表的头指针?
首先你的问题有点小小的误解,头指针意思为指向链表头结点的一个指针,你必须自己定义一个链表结点类型的指针,并指向那个链表的头结点就可以了~何来获取一说,因为本身就是你自己定义的~。你的问题应该是如何获取单项链表的头结点。常见的解决方案共有以下C语言试题及答案(2)
main() { int k, a[10]={1,2,3,4,5} for(k=1k<3k++) fun(a) for(k=0k<5k++) printf("%d", a[k].net包含什么
.Net主要包括普通语言运行时(Common Language Runtime)和.Net构架类库。.Net是为简化在第三代因特网的高分布式环境下的应用程序开发,基于开放互联网标准和协议之上,实现异质语言和平台高度交互性,而构建的新一代计在不同操作系统下python语言均不需要设置头文件
不需要。在C语言中需要包含头文件、创建主函数、使用头文件中的printf函数来进行输出。但在Python语言中无需包含头文件,就可以直接使用Python语言中的输出函数print来输出。Python由荷兰数学和计算机科学研究学会的Guidojava中long是什么意思
long 就是长整型的意思。java 的 8 个基本类型的一种。你应该要把 java 的 8 种基本类型一起记:byte short int long char float double booleanint 是 32 位的整数,longjava中long是什么意思
long 就是长整型的意思。java 的 8 个基本类型的一种。你应该要把 java 的 8 种基本类型一起记:byte short int long char float double booleanint 是 32 位的整数,longNET为什么被叫作.NET
参考:http:baike.baidu.comlink?url=X8YFgdkXt66Yi0136MiRYJCE9LOQgcAWgE7II8okQZTtk4X-IM5BmMx7My6eG1qst5yD_jJ3CxW2esaH3pHCURuby 比python 快吗? Ruby有封装功能吗? 用Ruby 需要交税吗? Ruby 需
Ruby 比python 快吗?不好比较,也无需比较,两者的速度大部分时间都是够用的,个别对速度高要求的场景用C扩展就好。Ruby有封装功能吗?这个问题不用问了吧。。。用Ruby 需要交税吗?不用,开源的。Ruby 需要向开发者、创始者、维net上支持哪些语言
如果是.net上层语言:C#VBC++F#JavascriptJ# 等大部分主流语言除在首次使用配置环境先择特定语言外,还可以打开新建项目中的其他语言中查看所支持的语言。如果是VS开发语言:其实VS只是一个IDE,支持的语言太多了python多版本和虚拟环境(pyenv+conda or virtualenv)
2.7.X 3.X Anaconda2 Anaconda3 pyenv是一个管理各个python版本的管理器。可以在系统里同时保留多个python版本,等需要时定义需要的版本。项目地址看项目地址中的readR语言-v1-基础知识
R语言-v1-基础知识 Iretara 12-17 21:18 以例题的形式简述R语言基础知识 # 读取文件setwd("文件链接的时候,用 ") install.pa【golang】高并发下TCP常见问题解决方案
首先,看一下TCP握手简单描绘过程: 其握手过程原理,就不必说了,有很多详细文章进行叙述,本文只关注研究重点。 在第三次握手过程中,如果服务器收到ACK,就会与客户端建立连接,此时内核会把连接从半连接队列移除,然后创建新的连接,并将有哪些比较好的区块链技术教程分享学习的论坛或者app
GO语言+区块链培训课程: 1、 Go有什么优势 Go的优势 1:性能 2:语言性能很重要 3:开发者效率&不要过于创新 4:并发性&通道 5:快速的编译时间 6:python怎么获取当前时间年月日?
取得时间相关的信息的话,要用到python time模块,python time模块里面有很多非常好用的功能,你可以去官方文档了解下,要取的当前时间的话,要取得当前时间的时间戳,时间戳好像是1970年到现在时间相隔的时间。你可以试下下面的方在r语言里怎么计算约束条件的f值
能尚未开发出来。estResult2 <- translogCostEst( cName = "COST", yName = "GDP", pNames = c( "PL&q本人想自学R语言,求推荐书籍,谢谢~
《An Introduction to R》《R4Beginners》《R Cookbook》《153分钟学会R》《R in a Nutshell》具体请看引用链接(不知道有什么词被禁了,帖不出来原文) %>%是管道符的意思,把怎么改变python安装包路径
在有的Python版本中在安装时,我们的可以再安装时选择Python路径的自动配备在选择python的安装程序的时候,我们尽量选择python的2.版本,因为随着Python的更新,Python的数据库会越来越强大,但是很多的Python数.NET开发是什么?需要用到哪些开发语言?
.NET是微软基于Windows研发的一种开发平台,而.NET开发就是针对Windows平台进行的开发,.NET开发可以用C#语言,VB语言进行开发。.NET平台是基于Windows的开发平台我们平时用的电脑都是装的Windows系统,而.C语言、C#、.net的区别是什么?
Net:它不是语言,而是微软推出的开发平台,在这个平台上可以使用VB、C#、C++、Java等语言编写程序。C#是微软公司发布的一种面向对象的、运于.NET Framework之上的高级程序设计语言。它包括了诸如单一继承、接口、与JavaR语言与统计-3:卡方检验
R语言与统计-1:t检验与秩和检验 R语言与统计-2:方差分析拟合优度检验是用卡方统计量进行统计显著性检验的重要内容之一。它是依据总体分布状况,计算出分类变量中各类别的期望频数,与分布的观察频数进行对比,判断期望频数与观察频数是否有一学就会,手把手教你用Go语言调用智能合约
智能合约调用是实现一个 DApp 的关键,一个完整的 DApp 包括前端、后端、智能合约及区块 链系统,智能合约的调用是连接区块链与前后端的关键。 我们先来了解一下智能合约调用的基础原理。智能合约运行在以太坊节点的 EVM 中。c语言串口通讯过程?
分接收端和发送端。接收端:1·打开com1端口fd=fopen("devttys0",方式)2·取得当前串口值,保存到结构体变量oldtiotcgetattr(fd,&oldtio)3·串口结构体变量nruby中怎么建立url,实现页面的跳转,简单实现就好。代码要具体。
是Ruby, 还是Rails?如果是在 Rails 里,直接在Action中写,比如:def helloredirect_to :action =>"index"enddef helloredirec在mac的os 10.12怎么配置ruby环境
对于新入门的开发者,如何安装 Ruby和Ruby Gems 的运行环境可能会是个问题,本页主要介绍如何用一条靠谱的路子快速安装 Ruby 开发环境。此安装方法同样适用于产品环境!系统需求首先确定操作系统环境,不建议在 Windows 上面谁知道有没有关于西洋古董收藏的网站?
专业的网站好像没有,要么就是雅昌、华夏这类古玩综合网站,要么就是以销售为主的网站。建议您可以去搜搜类似的博客,可能会有所发现。或者你去一个叫“古古收藏”的网站,那里面有一个资讯版块,内容蛮多,基本都是关于西洋古董的。网址是:http:wGo语言基础语法(一)
本文介绍一些Go语言的基础语法。 先来看一个简单的go语言代码: go语言的注释方法: 代码执行结果: 下面来进一步介绍go的基础语法。 go语言中格式化输出可以使用 fmt 和 log 这两个标有啥好玩的JAVA的手机单机足球游戏吗?要新出的,游戏最好大点的,破解版的
1、 FIFA 15:终极队伍《 FIFA 15:终极队伍 FIFA 15 Ultimate Team》是一款由巨头体育游戏公司EA推出的最新款足球体育游戏。游戏中由着真实球员,真实球队,真实联赛,让玩家不用出门也可以在足球场上一展雄风。2python多版本和虚拟环境(pyenv+conda or virtualenv)
2.7.X 3.X Anaconda2 Anaconda3 pyenv是一个管理各个python版本的管理器。可以在系统里同时保留多个python版本,等需要时定义需要的版本。项目地址看项目地址中的read请教一道用R语言预测实验样本量的问题
显然这是一个协方差分析,因为有基线水平。.pwr.t.test函数来自pwr包,其实就是cohen那本老书的具体实现只能计算简单的t检验并不适用 卡方拟合优度检验,用于衡量观测频数与期望频数之间的差异 一般地,假设总体分r类,分布假