编译使用jni.h的c文件

时间:2011-01-06 03:02:07

标签: java-native-interface

我无法编译以下程序

PPConverter.java:

 public class PPConverter {
    private native void convert(String s);
    public static void main(String[] args){
        new PPConverter().convert(args[0]);
    }
    static {
        System.loadLibrary("converter");
    }
}

converter.c:

 #include <jni.h>
 #include <stdio.h>
 #include "PPConverter.h"

 JNIEXPORT void JNICALL Java_PPConverter_convert (JNIEnv *, jobject, jstring){
    printf(jstring);
    return;
  }

由于我在UNIX上工作,我使用以下命令编译converter.c文件:

cc -I/usr/lib/jvm/java-6-openjdk/include  converter.c -o libconverter.so

但我收到以下错误:

converter.c: In function âJava_PPConverter_convertâ:
converter.c:5: error: parameter name omitted
converter.c:5: error: parameter name omitted
converter.c:5: error: parameter name omitted
converter.c:6: error: expected expression before âjstringâ

我做错了什么?

2 个答案:

答案 0 :(得分:11)

如果有人遇到此错误,问题是javah创建的头文件没有指定其参数的名称(它只是头文件而不是实现)。但是在您的实现中,如果您只是复制/粘贴头文件而不添加参数名称,那么您将收到错误。

所以头文件中的代码(由javah生成的文件,不要更改此文件):

JNIEXPORT void JNICALL Java_PPConverter_convert (JNIEnv *, jobject, jstring);

当你复制它(进入以.c或.cpp结尾的文件)时,需要有变量名称:

JNIEXPORT void JNICALL Java_PPConverter_convert (JNIEnv *env, jobject obj, jstring mystring){

这将解决它。

答案 1 :(得分:0)

JNIEXPORT void JNICALL Java_PPConverter_convert (JNIEnv *jbi, jobject obj, jstring str){
   printf(jstring);
   return;
  }
麻省你失去了什么