首先编写一个类例如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 <jni.h>
/* 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 <jni.h>
/* 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 <stdio.h>
#include <jni.h>
#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...") ;
}
此上 , 仅供参考学习。