バックグラウンド
JAVAにネイティブ機能がある
package mypackage;
public class MyWrapper {
private native int
wrapFilterRawRequest(String config, String rawRequest);
public void
processRequest( String configPath,String rawRequest){
int status = 0;
status = new MyWrapper().wrapFilterRawRequest(configPath, rawRequest);
status2 = new MyWrapper().wrapFilterRawRequest(configPath, rawRequest);
}
static{
System.loadLibrary("mylibrary");
}
}
および同じための C の JNI ラッパー
int processRequest(char *conf, char *req)
{
int status = 0;
// Do something here
return status;
}
JNIEXPORT jint JNICALL Java_mypackage_MyWrapper_wrapFilterRawRequest
(JNIEnv *env, jobject obj, jstring config, jstring rawRequest)
{
jint status = 0;
const char *conf, *req;
char *conf_copy, *req_copy;
conf = (env)->GetStringUTFChars(config, NULL);
req = (env)->GetStringUTFChars(rawRequest, NULL);
copy_str(&conf_copy, conf);
copy_str(&req_copy, req);
(env)->ReleaseStringUTFChars(config, conf);
(env)->ReleaseStringUTFChars(rawRequest, req);
status = processRequest(conf_copy , req_copy );
return status;
}
問題
JAVA でネイティブ関数を 2 回呼び出すと、アプリケーションでサポートされていない C 関数 processRequest(char*, char*) を連続して 2 回呼び出すのと同じことになるため、エラーが発生します。実行可能ファイルを 2 回実行するときと同様に、毎回スタンドアロンで呼び出せるようにしたいと考えています。(プログラムは 2 回呼び出された場合は機能しますが、同じアプリケーションで同じ関数が 2 回呼び出された場合は機能しません)。ネイティブ呼び出しを行うときに、JNI がすべてを再初期化するようにします。これどうやってするの?