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下运行了,急得要指定库的路径
(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的用法就行了。