2011-01-06 34 views
5

Tôi gặp rắc rối biên soạn chương trình sau đâybiên dịch tập tin c sử dụng jni.h

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; 
    } 

Kể từ khi tôi đang làm việc trên UNIX, tôi đang sử dụng lệnh sau đây để biên dịch tệp converter.c:

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

nhưng tôi nhận được các lỗi sau đây:

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â 

Tôi đang làm gì vậy ??

+1

Bạn đã đọc các thông báo lỗi chưa? Chúng cho bạn biết chính xác những gì còn thiếu: tên của các tham số trong chữ ký phương thức. –

+0

Tôi nghĩ tôi cần nghỉ ngơi. Tôi không thể tin rằng tôi đã bỏ lỡ điều đó. – twidizle

+0

Tên hàm là lạ. Hãy chắc chắn rằng tên là tên hàm hợp lệ. – qrtt1

Trả lời

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

maby u bị mất một cái gì đó

8

Trong trường hợp bất cứ ai chạy vào lỗi này, vấn đề là các tập tin tiêu đề được tạo ra bởi javah không ghi rõ tên của các tham số của nó (nó chỉ là một tập tin tiêu đề không phải là một thực hiện). Nhưng trong quá trình triển khai, nếu bạn chỉ sao chép/dán tệp tiêu đề mà không thêm tên thông số, bạn sẽ gặp lỗi.

Vì vậy, các mã từ tập tin tiêu đề của bạn (các tập tin được tạo ra bởi javah, không thay đổi tập tin này):

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

Khi bạn sao chép nó (vào tập tin của bạn kết thúc bằng .c hoặc cpp), cần phải có tên biến:

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

Điều này sẽ khắc phục.

Các vấn đề liên quan