こんにちは私は現在、C++フレームワークがJavaプログラムに統合されるプロジェクトに取り組んでおり、JNIの探索を開始しました。私は現在、型変換に苦しんでおり、C++が初めてのので、Javaのネイティブメソッドで宣言する必要がある引数の型は何ですか。Java JNI UnsatisfiedLinkErrorポインタへのC charポインタ
私は次のメソッドを持つCPP-ファイルで:
using namespace std;
int main(int argc,char**argv)
{
//do stuff
}
マイ対応するJavaクラスは、次のようになります。
public class JniTest {
static {
System.loadLibrary("plain2snt");
}
public JniTest() {
char[][] arguments = new char[][] {"resourceFile1.txt".toCharArray(), "resourceFile2.txt".toCharArray()};
main(2, arguments);
}
public native int main(int argc, char[][] argv);
}
とJavaクラスのヘッダファイルは以下の通りです:
#include <jni.h>
/* Header for class testPackage_JniTest */
#ifndef _Included_testPackage_JniTest
#define _Included_testPackage_JniTest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: testPackage_JniTest
* Method: main
* Signature: (I[[C)I
*/
JNIEXPORT jint JNICALL Java_testPackage_JniTest_main
(JNIEnv *, jobject, jint, jobjectArray);
#ifdef __cplusplus
}
#endif
#endif
実行しようとすると、次のエラーが表示されます。
私は既にGoogleとJNI APIのリファレンスなどを使ってJavaとC++の間で一致する型を検索しましたが、Javaのポインタ型のchar型を処理する方法が見つかりませんでした。 cppフレームワークのchar **と一致するargv引数のJavaクラスの実際の型定義は何でしょうか?
があなたの速い応答をありがとう:あなたは、次の方法で引数を取得することができ++ Cで
!私はJNIEXPORT jintを私のライブラリに追加しました。少なくともこれは、私がcppファイルにこのメソッドを実装することによって(あなたが提供し、それを適用したコードの3番目の部分を与えて)行い、cppファイルをdllに再コンパイルしたと思います。これは正常に機能しましたが、私はまだサメエラーが発生します。 JNI APIとそのワークフローに関する何かを誤解する必要がありますか? – SvenBTU
さて、私は問題を解決しました。私のJavaクラスでは、そのクラスのオブジェクトを初期化せず、ネイティブのメインメソッドを呼び出しただけです。だから私は基本的にJniTest()をpublic JniTest(){String [] arguments = new String [] {"resourceFile1.txt"、 "resourceFile2.txt"}に変更しました。 JniTestテスト=新しいJniTest(); test.main(2、arguments); } – SvenBTU