2015-09-11 186 views
3

我正在努力解決一個基本問題。我試圖從Java調用.dll - 函數具有以下簽名:將C++ double *轉換爲Java double

int function(double* a, double b); 

我的問題是,我不知道如何使用Java中的double* a參數和功能如何後打印操作值通話已完成。

+1

可能重複的[如何通過從指針java到C在JNI?](http://stackoverflow.com/questions/10381773/how-to-pass-pointers-from-java-to-c-in-jni) – user1

+0

我試過只是爲了通過變量作爲簡單的雙打比賽。這個函數需要通過引用來調用,變量a也是返回值。 int值只是一個錯誤代碼。 – wurmi

+0

爲此目的提供了JNA的['DoubleByReference'](https://jna.java.net/nonav/javadoc/com/sun/jna/ptr/DoubleByReference.html),但您也可以使用原始數組。 – technomage

回答

5

我認爲剛開輸出回到最簡單的情況下,使用雙[]與1

長度這是我的java文件(usefunc.java):

public class usefunc { 

    static { 
     System.loadLibrary("usefunc"); 
    } 
    public native int function(double a[], double b); 

    public static void main(String args[]) { 
     double a[] = new double[1]; 
     new usefunc().function(a,1.0); 
     System.out.println("a[0] = " + a[0]); 
    } 
} 

這是我的C++文件(usefunc.cpp):

#include <jni.h> 

extern "C" { 
    JNIEXPORT jint JNICALL Java_usefunc_function 
    (JNIEnv *env, jobject obj, jdoubleArray a, jdouble b); 
    int function(double *a, double b); 
} 

int function(double* a, double b) { 
    *a = 77.7; 
    return 0; 
} 

/* 
* Class:  usefunc 
* Method: function 
* Signature: ([DD)I 
*/ 
JNIEXPORT jint JNICALL Java_usefunc_function 
(JNIEnv *env, jobject obj, jdoubleArray a, jdouble b) { 
    jboolean iscopy; 
    double *nativeA = env->GetDoubleArrayElements(a, &iscopy); 
    jint ret = function(nativeA, b); 
    env->ReleaseDoubleArrayElements(a, nativeA, 0); 
    return ret; 
} 

編譯時:

g++ -I /usr/local/jdk1.8.0_60/include/ -I /usr/local/jdk1.8.0_60/include/linux/ -shared usefunc.cpp -o libusefunc.so 
javac usefunc.java 

冉與:

java usefunc 

生產:

a[0] = 77.7 
+0

非常感謝!清潔和簡單。它解決了我的問題。 – wurmi

3

隨着JNA,避免任何本地編譯超出目標的共享庫:

public class usefunc { 

    static { 
     Native.register("usefunc"); 
    } 
    public static native int function(double a[], double b); 
    public static native int function(DoubleByReference dp, double b); 

    public static void main(String args[]) { 
     double a[] = new double[1]; 
     usefunc.function(a,1.0); 
     System.out.println("a[0] = " + a[0]); 

     DoubleByReference dp = new DoubleByReference(); 
     usefunc.function(dp,1.0); 
     System.out.println("dp = " + dp.getValue()); 
    } 
} 
相關問題