2012-02-15 31 views
1

我有一些問題試圖讓JNI工作。 我有一個C++應用程序,我想在我的Java程序中調用這個應用程序的方法。 我寫了我的Java程序調用本地方法,然後我用javah來生成頭文件。一旦我的C++測試程序被編譯成一個庫.so,我從我的java程序調用這個庫。加載System.loadLibrary是好的,但似乎他無法找到它的方法。我得到一個:JNI:java.lang.UnsatisfiedLinkError錯誤

Exception in thread "main" java.lang.UnsatisfiedLinkError: ApiPackets.get_lost_packets()V 
    at ApiPackets.get_lost_packets(Native Method) 
    at ApiPackets.main(ApiPackets.java:12) 

這裏是我的Java調用本地方法:

public class ApiPackets { 

    public native void get_lost_packets(); 
    public native int get_late_packets(); 
    public native int get_out_of_order_packets(); 

    static { System.loadLibrary("ApiPackets");} 

    public static void main(String[] args) { 
     ApiPackets api = new ApiPackets(); 
     System.out.println("pass"); 
     api.get_lost_packets(); 
} 
} 

這是我的C++,然後編譯成libApiPackets.so

#include "ApiPackets.h" 
#include <stdio.h> 
#include "main_window.h" 

JNIEXPORT void JNICALL Java_ApiPackets_get_lost_packets 
    (JNIEnv * env, jobject obj) { 
    printf("coucou"); 
    return; 
} 

JNIEXPORT jdouble JNICALL Java_ApiPackets_get_1late_1packets 
    (JNIEnv * env, jobject obj) { 
    jdouble late = mw->priv->current_call->get_late_packets(); 
    return late; 
} 

JNIEXPORT jdouble JNICALL Java_ApiPackets_get_1out_1of_1order_1packets 
    (JNIEnv * env, jobject obj) { 
    jdouble out_of_order = mw->priv->current_call->get_out_of_order_packets(); 
    return out_of_order; 
} 

回答

1

的C++函數必須聲明extern "C"。 (JNI宏 JNIEXPORT不這樣做,因爲它被設計用於C 和C++。)

+0

我有同樣的問題,我已嘗試應用您的建議在我的.h文件,但它不起作用。這裏有一個片段:「extern」C「JNIEEXPORT void JNICALL Java_cppjbridge_HelloJNI_changeJavaStatus (JNIEnv *,jclass); }' – 2014-06-19 15:16:07