jni调用c的话,c中不需要main()的。你把java方法生成c的头文件,就转换成了你在C下的格式,引用就可以了。给你个例子:
//java,DisplayMessage方法
public class DisplayMessage{
static{
System.loadLibrary("MessageHandler");
}
public static void main(String[] args){
printMessage();
}
/*printMessage()是要用的自然方法*/
public static native void printMessage();
}命令javac -jni DisplayMessage.class
则生成头文件DisplayMessage.h,如下
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class DisplayMessage */#ifndef _Included_DisplayMessage
#define _Included_DisplayMessage
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: DisplayMessage
* Method: printMessage
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_DisplayMessage_printMessage
(JNIEnv *, jclass);#ifdef __cplusplus
}
#endif
#endif你不要修改,但到中间的一句了吗?
——JNIEXPORT void JNICALL Java_DisplayMessage_printMessage
(JNIEnv *, jclass);你拷下来粘到你要写得C程序中,只需要在()种的参数类型后给出变量名就可以,这就是jni要引用的C生成的库
#include <stdio.h>
#include "DisplayMessage.h"JNIEXPORT void JNICALL Java_DisplayMessage_printMessage
(JNIEnv *env, jclass cl)
{
printf("Hello,Maggie!");
}然后你就可以在Java下运行了,急得要指定库的路径
//java,DisplayMessage方法
public class DisplayMessage{
static{
System.loadLibrary("MessageHandler");
}
public static void main(String[] args){
printMessage();
}
/*printMessage()是要用的自然方法*/
public static native void printMessage();
}命令javac -jni DisplayMessage.class
则生成头文件DisplayMessage.h,如下
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class DisplayMessage */#ifndef _Included_DisplayMessage
#define _Included_DisplayMessage
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: DisplayMessage
* Method: printMessage
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_DisplayMessage_printMessage
(JNIEnv *, jclass);#ifdef __cplusplus
}
#endif
#endif你不要修改,但到中间的一句了吗?
——JNIEXPORT void JNICALL Java_DisplayMessage_printMessage
(JNIEnv *, jclass);你拷下来粘到你要写得C程序中,只需要在()种的参数类型后给出变量名就可以,这就是jni要引用的C生成的库
#include <stdio.h>
#include "DisplayMessage.h"JNIEXPORT void JNICALL Java_DisplayMessage_printMessage
(JNIEnv *env, jclass cl)
{
printf("Hello,Maggie!");
}然后你就可以在Java下运行了,急得要指定库的路径
解决方案 »
- 编译时异常和运行时异常有什么区别啊?
- webservice中ArrayOfstring类型应该怎么传入字符串信息
- 通过递归方法调用将文件路径储存到字符数组
- 前台程序和后台程序
- 谢谢html:multibox的使用,还有,可以的话,我还想了解下,如何让其全部选中,
- 急急,请问由代码产生uml图怎么实现哦?谢谢!!
- 令人头痛的结果
- 请高手解答一个SWT/JFace的问题
- 图书板块我进不去,借个地方一用:上海有兄弟愿意出售Java2图形设计vol2:Swing么?
- 学过C++,想学java,难吗?多久能上手?
- ****请教大虾.(执行顺序)
- 利用Java poi插件创建和读取Excel文档遇到的一个问题?
(JNIEnv *env, jclass cls, jobjectArray sa)
{
int len = (*env)->GetArrayLength( env, sa );
int i=0;
for( i=0; i < len; i++ )
{
jobject obj = (*env)->GetObjectArrayElement(env, sa, i);
jstring str = (jstring)obj;
const char* szStr = (*env)->GetStringUTFChars( env, str, 0 );
printf( "%s ", szStr );
(*env)->ReleaseStringUTFChars( env, str, szStr );
}
printf( "\n" );
}
char ** 不就是一个字符串数组么,就是这样传的,注意sa的用法就行了。