내 프로젝트 중 하나는 자바 (애플리케이션 측 및 모듈 측)에 대한 완벽한 PAM 구현을 구현하고자한다.객체 인스턴스에 네이티브 (C) 포인터 유지 - 이후에 정리하기
지금 당장은 응용 프로그램을 사용하고 있습니다. 나는 도심 jpam했다하지만 난 문제가 우연히 발견, 주변 검색의 몇 시간 후에 나는 아직도 내 문제에 대한 해결책 찾을 수 없습니다 :/
이 현재 코드 :
JNIEXPORT jint JNICALL Java_org_eel_kitchen_pam_PamHandle_authenticate(
JNIEnv *pEnv, jobject pObj, jstring pServiceName, jstring pUsername,
jstring pPassword, jboolean debug)
{
pam_handle_t *pamh = NULL;
int retval;
/*
* TODO: unclear, see what's what
*
* With my first tests, it appears that GetStringUTFChars() makes the JVM
* crash if memory cannot be allocated... But an array copy was made. See
* what happens if the JVM decides NOT to make a copy. Right now it is
* assumed that allocations succeed. And the JNI spec says
* GetStringUTFChars() does NOT throw an OOM on failure.
*/
service_name = (*pEnv)->GetStringUTFChars(pEnv, pServiceName, NULL);
username = (*pEnv)->GetStringUTFChars(pEnv, pUsername, NULL);
password = (*pEnv)->GetStringUTFChars(pEnv, pPassword, NULL);
/* Get a handle to a PAM instance */
retval = pam_start(service_name, username, &PAM_converse, &pamh);
if (retval != PAM_SUCCESS) {
pr_debug("pam_start failed for service %s: %s\n", service_name,
pam_strerror(NULL, retval));
goto out_nohandle;
}
pam_set_item(pamh, PAM_AUTHTOK, password);
retval = pam_authenticate(pamh, 0);
/* Is user permitted access? */
if (retval != PAM_SUCCESS) {
pr_debug("failed to authenticate user %s: %s\n", username,
pam_strerror(NULL, retval));
goto out_free;
}
retval = pam_acct_mgmt(pamh, 0);
if (retval != PAM_SUCCESS)
pr_debug("failed to setup account for user %s: %s\n", username,
pam_strerror(NULL, retval));
out_free:
/* Clean up our handles and variables */
if (pam_end(pamh, retval) != PAM_SUCCESS) {
pamh = NULL;
pr_debug("Fuchs! Failed to release PAM handle\n");
}
out_nohandle:
(*pEnv)->ReleaseStringUTFChars(pEnv, pServiceName, service_name);
(*pEnv)->ReleaseStringUTFChars(pEnv, pUsername, username);
(*pEnv)->ReleaseStringUTFChars(pEnv, pPassword, password);
return retval;
}
를 내가 여기에 PamHandle
의 모든 인스턴스에 대해 pamh
에 대한 참조를 유지하고 싶습니다. 어떻게 이뤄지나요?
편집 : OK,이 답을 가지고 있고, 지금이 정리 부분이다 : 다음 super.finalize();
을 기본 정리 메서드를 호출 finalize()
을 사용합니까, 또는 GC에 의해 트리거되는 JNI 기능이있는 나는 구현할 수 있습니까?
원하는 것이 명확하지 않습니다. Java 오브젝트에 C 포인터를 보관하려면 일반적으로이를 'long'에 지정하십시오. –
@HotLicks 나는'PamHandle'의 각 인스턴스가 처분으로서 유일한'pamh'를 갖도록하고 싶습니다. 만약 내가 @Als를 올바르게 이해한다면, 나는 그 파일의 범위를 변경할 수 있으며, 각 인스턴스는 자신의 것을 가질 것이다. ... – fge
@fge GC는 그 포인터를 안정적으로 정리할 수 없다. Java에서이 작업을 수행하는 한 가지 일반적인 방법은 [Closable] (http://docs.oracle.com/javase/1.5.0/docs/api/java/io/Closeable.html)에서 파생시키는 것입니다. 그런 다음 파이널 라이저에서 당신은 가까이에 전화를 걸지 만 단지 들어오지 못하게합니다. – Lalaland