「cjava函数」char *matchchar c 函数调用

博主:adminadmin 2023-03-17 17:50:13 214

今天给各位分享cjava函数的知识,其中也会对char *matchchar c 函数调用进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

如何从C中调用Java函数使用JNI

1. 编写并编译J2C.java

import java.lang.management.ManagementFactory;

import java.lang.management.RuntimeMXBean;

public class J2C

{

static

{

try{

// 此处即为本地方法所在链接库名

System.loadLibrary("j2c");

} catch(UnsatisfiedLinkError e)

{

System.err.println( "Cannot load J2C library:\n " +

e.toString() );

}

}

//声明的本地方法

public static native int write2proc(int pid);

public static void main(String[] args){

//获取本进程(即主线程)的pid

final RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();

final String info = runtime.getName();

final int index = info.indexOf("@");

if (index != -1) {

final int pid = Integer.parseInt(info.substring(0, index));

System.out.println(info);

System.out.println(pid);

write2proc(pid);

}

try{

Thread.sleep(8000);

} catch(InterruptedException e){

e.printStackTrace();

}

}

}

note:Java程序中System.loadLibrary参数名表示要载入的C/C++共享库,第6步生成的共享库名必须与该参数一致,即System.loadLibrary(Name) 对应共享库名libName.so (共享库名必须以lib开头)

2. 生成C头文件J2C.h:javah J2C

/* DO NOT EDIT THIS FILE - it is machine generated */

#include jni.h

/* Header for class J2C */

#ifndef _Included_J2C

#define _Included_J2C

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: J2C

* Method: write2proc

* Signature: (I)I

*/

JNIEXPORT jint JNICALL Java_J2C_write2proc

(JNIEnv *, jclass, jint);

#ifdef __cplusplus

}

#endif

#endif

note:1. 头文件自动生成,不要修改它;

2. 函数JNIEXPORT jint JNICALL Java_J2C_write2proc(JNIEnv *, jclass, jint);

按照注释的说明是在J2C.java文件的类J2C的方法write2proc处定义,故C程序的实现函数必须与该处签名一致;

3. 编写C程序J2C.c

#include stdio.h

#include "J2C.h"

JNIEXPORT int JNICALL Java_J2C_write2proc(JNIEnv * env, jobject arg, jint pid)

{

printf("current pid is %d\n", pid);

return 0;

}

4. 编译C程序

因为C程序里#include "J2C.h"而J2C.h又#include jni.h, 而gcc里面默认环境并不知道jni.h是什么东西,故编译时需要告诉编译器jni.h的位置( jni.h在jdk 的$JAVA_HOME/include下面),所以才有了上面的编译参数;

因为使用gcc编译得到动态库,在jni调用的时候,某些情况会有异常, 可尝试改用g++。

总结

1. Java中方法的原型声明与C/C++对应的实现文件定义必须一致(可以通过自动生成的C/C++头文件来比较),尤其是类名和方法名;

2. Java中System.loadLibrary()载入的共享库名必须与后面C/C++生成的共享库名一致。

java中的方法与C语言中的函数有什么区别?

实际上算法核心思想没变,只是表达的语法不一样,一个是在Java语法下的表达,一个是在c语言下的表达。

java中的方法和C语言中的函数差不多,在java中也可以叫函数吧,但是java中的方法有继承,重载等一些列功能。C语言里有结构体

c语言等语言里叫函数,面向对象编程,函数写到类里边就叫做方法,函数可以直接调用,对象中的方法一般都有指针this指向它,但是有时一些方法实在不需要写到类里边,所以面向对象的语言有了静态方法。

函数Function, 过程Procedure, 方法Method,你可以简单把他们当成同一个概念:都是由若干语句组成的一个可执行代码体。

函数:Function(面向过程语言教程的英文原版,是否有一个把Function翻译为Method的?)

方法:Method(只有不地道的面向对象语言教程才会把Method叫做Function)

JAVA如何调用C函数

要在java中调用c语言的库,需要使用Java提供了JNI。

举例说明

在c语言中定义一个 void sayHello()函数(打印Hello World);然后在Java中调用这个函数显示Hello Word.

现在分别从Java和C语言两部分说明:

1. Java 部分

首先定义一个HelloNative,在其中申明sayHello函数,函数要申明为Native 类型的.如下:

public class HelloNative {

public native void sayHello();

}

编译这个类,生成class文件:

javac HelloWorld.java

利用javah生成需要的h文件

javah HelloNative

生成的 h文件大概如下:

/* DO NOT EDIT THIS FILE - it is machine generated */

#include jni.h

/* Header for class HelloNative */

#ifndef _Included_HelloNative

#define _Included_HelloNative

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: HelloNative

* Method: sayHello

* Signature: ()V

*/

JNIEXPORT void JNICALL Java_HelloNative_sayHello

(JNIEnv *, jobject);

#ifdef __cplusplus

}

#endif

#endif

可以看一下上面自动生成的程序,程序include了jni.h,这个头文件在 $JAVA_HOME下的include文件夹下. 还可以发现生成的函数名是在之前的函数名前面加上了Java_HelloNative。

2. C语言部分

根据上面生成的h文件编写相应的代码实现,建立一个 HelloNative.cpp用来实现显示Hello World的函数.如下:

#include stdio.h

#include "HelloNative.h"

JNIEXPORT void JNICALL Java_HelloNative_sayHello(JNIEnv *, jobject)

{

printf("Hello World!\n");

}

代码编写完成之后,我们再用gcc编译成库文件,命令如下;

gcc -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

这样就会在当前目录下生成一个libHelloNative.so的库文件.这时需要的库已经生成,在C语言下的工作已经完成了.

接下来需要在Java中编写一个程序测试一下.在程序前,需要将我们的库载入进去.载入的方法是调用Java的 System.loadLibrary("HelloNative");

public class TestNative

{

static {

try {

System.loadLibrary("HelloNative");

}

catch(UnsatisfiedLinkError e) {

System.out.println( "Cannot load hello library:\n " + e.toString() );

}

}

public static void main(String[] args) {

HelloNative test = new HelloNative();

test.sayHello();

}

}

但是再编译后,运行的时候,问题又出现了.

Cannot load hello library:

java.lang.UnsatisfiedLinkError: no HelloNative in java.library.path

Exception in thread "main" java.lang.UnsatisfiedLinkError: HelloNative.sayHello()V

at HelloNative.sayHello(Native Method)

at TestNative.main(TestNative.java:13)

载入库失败,但是库明明就是放在当前文件夹下的,怎么会载入失败呢?

用System.getProperty("java.library.path")查看,发现java.library.path中并不u存在当前的目录.主要有以下的几个解决办法:

1) 将生成的库复制到java.library.path有的路径中去,当然这样不是很好

2) 设置环境变量export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ,将当前的目录加入到LD_LIBRARY_PATH中

3) 设置java 的选项,将当前的目录加入到其中 .java -Djava.library.path=. $LD_LIBRARY_PATH

这样之后程序就能够成功的运行了.可以看见显示的"Hello World!"了

java调用C 函数

利用java的JNI技术,具体内容贴出来太多,网上也有很多这个资料,楼主可以做个参考

函数和方法 为啥c中叫函数 java中叫方法 那c++呢 注意我问的是为什么!!!!

我们要明白一点,C语言的function和Java语言的function是同一个单词,在英文世界里没有人会区别哪个是“方法”哪个是“函数”。所以翻译成“函数”和“方法”的主要原因是因为最初引入这些编程到大陆的翻译人员的习惯。

在Python语言中,在类中的函数常叫做“方法”。以此推测,Java万物皆是类,基本每一个函数都在类中,所以Java中的所有的函数都叫做“方法”。

C++里面的函数叫做“函数”。

C语言、Java语言官方文档

Python中文手册

java中的方法与C语言中的函数有什么区别

这个我一般都避免在细节上比较这两种语言,因为一种是动态的,一种是静态的,导致了数据处理方式上的较大区别。但是鉴于有点想回答你这个问题于是就尝试着来比较一下:

1. Java 方法对应 Java 语言的作用 就相当于 C 函数 对应于 C 语言的作用,这个应该没有疑问,就算是角色作用相似吧。

2. Java 的静态方法可以说更接近 C 的函数,它们都有自己的一个名称、返回值类型和参数列表、和函数体(方法体),并且都是“静态”的。最后这点就不适合成员方法。这个可以算是形式上的相似点。

3. Java 支持方法重载,C 语言不支持,这是功能上的不同点。

4. Java 方法有四种访问权限,C 一视同仁,这是功能上的不同点。

5. Java 方法是属于类/对象的,C 就说不上属于哪个了,这算什么不同?

cjava函数的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于char *matchchar c 函数调用、cjava函数的信息别忘了在本站进行查找喔。