java c 签名 范例_自动生成Jni中Java调用C语言实现的签名函数名 | 学步园

首先编写一个类例如HelloWorld.java类文件

把你要在Java代码中声明的调用C语言的native函数声明写在Helloworld.java代码中

例如:

public class HelloWorld{

public native String HelloFromC() ;

public native String hell_from_c() ;

}

然后用javac编译这个代码

javac HelloWorld.java

会生成HelloWorld.class的文件

然后用javah 编译class文件

javah HelloWorld

会生成一个HelloWorld.h的头文件

头文件中就包含了你要调用C代码的底层实现方法名。

例如

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

#include

/* Header for class HelloWorld */

#ifndef _Included_HelloWorld

#define _Included_HelloWorld

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class:     HelloWorld

* Method:    HelloFromc

* Signature: ()Ljava/lang/String;

*/

JNIEXPORT jstring JNICALL Java_HelloWorld_HelloFromc

(JNIEnv *, jobject);

/*

* Class:     HelloWorld

* Method:    hello_from_c

* Signature: ()Ljava/lang/String;

*/

JNIEXPORT jstring JNICALL Java_HelloWorld_hello_1from_1c

(JNIEnv *, jobject);

#ifdef __cplusplus

}

#endif

#endif

其中 Java_HelloWorld_hello_1from_1c(JNIEnv *, jobject); 就是要定义代码要实现的函数签名

这样做的好处是防止自己手写过程中出现不必要的错误。。

以上是没有带包名的C代码的函数签名 如果要带包名的函数签名 就要模拟你Java声明调用C语言java代码的目录结构

例如 java包名是 com.explame.cn 你就要创建这样的目录结构

HelloWsorld.java引用包名

import  com.explame.cn;

public class HelloWorld{

public native String HelloFromC() ;

public native String hell_from_c() ;

}

执行javac命令后 把生成的class文件放入创建的包目录下

然后执行javah 命令来生成C代码函数签名,不过这时你要显示的指出包名不然会出错

javah com.explame.cn.HelloWord

执行过后会生成一个com.explame.cn.HelloWord.h的头文件,文件里面就会生成C语言的函数签名的头文件。

然后把生成的头文件放进jni目录下

这样你就可以利用C/C++的特性在头文件中声明函数在.c或.cpp文件中实现函数

具体如下:

com.explame.cn.HelloWord.h的头文件

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

#include

/* Header for class HelloWorld */

#ifndef _Included_HelloWorld

#define _Included_HelloWorld

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class:     HelloWorld

* Method:    HelloFromc

* Signature: ()Ljava/lang/String;

*/

JNIEXPORT jstring JNICALL Java_com.explame.cn_HelloWorld_HelloFromc

(JNIEnv *, jobject);   //C代码的声明

/*

* Class:     HelloWorld

* Method:    hello_from_c

* Signature: ()Ljava/lang/String;

*/

JNIEXPORT jstring JNICALL Java_com.explame.cn_HelloWorld_hello_1from_1c

(JNIEnv *, jobject);

#ifdef __cplusplus

}

#endif

#endif

com.explame.cn.HelloWord.c的实现

#include

#include

#include "com.explame.cn.HelloWord.h" //引入头文件

//头文件中声明的具体实现

JNIEXPORT jstring JNICALL Java_com.explame.cn_HelloWorld_HelloFromc

(JNIEnv *, jobject){

return (*(*env)).NewStringUTF(env,"Hello From C...") ;

}

JNIEXPORT jstring JNICALL Java_com.explame.cn_HelloWorld_hello_1from_1c

(JNIEnv *, jobject){

return (*(*env)).NewStringUTF(env,"Hello From C...") ;

}

此上 , 仅供参考学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值