簡體   English   中英

JNI 將參數傳遞給 c++ 的方法

[英]JNI pass parameters to method of c++

我有一個 c++ 文件 myCppTest.cpp 它有方法

int myFunction(int argv, char **argc) {
}

和 myClass.java 中的 Java 本機方法

public native int myFunction (int argv, char[][] argc);

使用 javah -jni myClass 生成 header 文件后,我有 header

JNIEXPORT jint JNICALL Java_JPTokenizer_init
  (JNIEnv *, jobject, jint, jobjectArray);

在我的 myClass.cpp 中,我定義了

JNIEXPORT jint JNICALL Java_JPTokenizer_init
  (JNIEnv *env, jobject obj, jint argv, jobjectArray argc) {
        //need to call int myFunction(int argv, char **argc) in myCppTest.cpp 
}

我怎么能將 arguments “jint argv,jobjectArray argc”傳遞給“int argv,char **argc”,謝謝。

編輯:

我想我犯了一個錯誤

myClass.java 中的 Java 本機方法應該是

公共本機 int init (int argv, char[][] argc);

所以有

 JNIEXPORT jint JNICALL Java_myClass_init (JNIEnv *, jobject, jint, jobjectArray);

javah之后生成的。 在 myClass.cpp 中,我有

 JNIEXPORT jint JNICALL Java_myClass_init (JNIEnv *env, jobject obj, jint argv, jobjectArray argc) { //需要在 myCppTest.cpp 中調用 int myFunction(int argv, char **argc) }

您可以創建 class 的 object 並像任何其他 C++ 代碼一樣調用方法。

JNIEXPORT jint JNICALL Java_JPTokenizer_init
    (JNIEnv *env, jobject obj, jint argv, jobjectArray argc) {
      myClass obj;  //create object of the class you want
      obj.myFunction((int) argv, (char *) &argc); //call the method from that object
}

There is no direct mapping between Java objects and C++ primitives, so you will have to convert the arguments that are passed by the Java runtime environment, and then call your function.

Java 將調用Java_JPTokenizer_init - 這是您執行轉換並調用“普通舊”C++ function 的地方。

要轉換字符串數組,您首先需要訪問數組,然后是單個字符串。

通常當我需要訪問本機庫時,我使用JNA而不是 JNI。 通常,JNA 比 JNI 更容易設置,因此您可能想嘗試一下。

干杯,費利佩

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM