문제

Windows XP의 애플릿에서 호출 할 C ++로 JNI 코드를 작성하고 있습니다. 나는 애플릿을 성공적으로 실행하고 JNI 라이브러리를로드하고 호출 할 수 있었으며, 다른 DLL에서 기능을 호출하는 한 멀리 이동했습니다. 모든 DLL이 포함 된 디렉토리를 포함하도록 경로 시스템 환경 변수를 설정 하여이 작업을 수행했습니다.

따라서 문제는 새로운 외부 DLL을 사용하는 또 다른 호출을 추가하고 갑자기 라이브러리를로드 할 때 불만족스러운 링크러러가 던져진다는 것입니다. 메시지는 '지정된 절차를 찾을 수 없었습니다'입니다. 종속 DLL을 제거하고 종속 DLL 누락에 대한 다른 메시지를 얻을 수 있기 때문에 누락 된 종속 DLL에 문제가되지 않는 것 같습니다. 내가 온라인으로 찾을 수있는 것에서이 메시지는 기본 Java 기능 구현이 DLL에서 누락 된 것을 의미하지만,이 추가 코드 없이는 잘 작동하는 것이 이상합니다.

이것을 일으키는 원인이 무엇인지 아는 사람이 있습니까? UnsatifedLinkerror에 대한 '지정된 절차를 찾을 수없는'메시지를 제공 할 수있는 것은 무엇입니까?

도움이 되었습니까?

해결책

나는 문제를 알아 냈다. 이것은 doozy였습니다. "지정된 절차를 찾을 수 없음"이라는 메시지는 불만족스러운 링크러로서 루트 dll 또는 in을 나타냅니다. 종속 DLL 찾을 수 없습니다. JNI 상황에서 이것의 가장 큰 원인은 기본 JNI 기능이 올바르게 내보내지 않았기 때문입니다. 그러나 종속 DLL이로드되고 DLL에 부모가 요구하는 함수가 누락 된 경우 이런 일이 발생할 수 있습니다.

예를 들어, input.dll이라는 라이브러리가 있습니다. DLL 검색 순서는 항상 애플리케이션 디렉토리를 먼저 살펴보고 경로 디렉토리는 지속되는 것입니다. 과거에는 항상 input.dll과 동일한 디렉토리에서 실행 파일을 실행했습니다. 그러나 Windows System 디렉토리에는 다른 Input.dll이 있습니다 (DLL 검색 순서의 중간에 있음). 따라서 Java 애플릿에서 이것을 실행할 때, 위에서 설명한 코드를 애플릿에 포함 시키면 Input.dll이로드되게하는 경우 시스템 디렉토리에서 input.dll을로드합니다. 우리 코드는 input.dll에서 특정 함수를 기대하기 때문에 (다른 DLL이기 때문에) 부하가 누락 된 절차에 대한 오류 메시지로 실패합니다. JNI 함수가 잘못 내보내기 때문이 아니라 잘못된 종속 DLL이로드되었고 예상 기능이 없었기 때문입니다.

다른 팁

DLL이 C ++를 사용하여 구축되었을 가능성이 있습니다 (C와는 반대로). 절차에 대한 외관을 조심하지 않는 한, 이것이 가능한 한 가지 이유입니다.

DLL에서 모든 기능을 내보내십시오. 목록에 기능이 포함되어 있으면 좋습니다.

일반적으로 다른 라이브러리에 링크 할 때 관련 .lib 파일에 링크해야합니다. 필요한 모든 LIB 파일을 참조하지 않는 것 같습니다. 연결되지 않은 내용을 확인하고 LIB를 링커 목록에 추가하십시오.

표준 JNI 절차를 사용하여 새로운 외부 DLL을 만들었습니까? 즉, Javah 등을 사용합니까? 그렇다면 무엇이 잘못되었는지 잘 모르겠습니다.

그렇지 않다면, 전화를하려는 절차는 (Anjanb에서 언급했듯이) 내보내지 않았습니다. 기능을 내보내는 두 가지 방법을 알고 있습니다 : 별도의 내보내기 목록과 __declspec (dllexport)로 특정 함수를 표시합니다.

C 앱에서 C ++ DLL에서 변수에 액세스 할 수 없습니다. DLL의 주제에 대해 조금 더 많은 정보가 있습니다.

디버그 모드에서 C ++ 코드를 컴파일하십시오. 그런 다음 디버그 브레이크 ()를 삽입합니다. 디버깅을 시작하고 싶은 진술. Java 코드를 실행하십시오. 디버그 브레이크 () 명령문이 발생하면 디버그 버튼이있는 팝업이 나타납니다. 클릭하십시오. Dev Studio는 프로그램과 함께 기계 코드로 열립니다. 디버거를 두 번 밟으면 소스 코드를 넘길 수 있어야합니다.

JNI 매뉴얼 및 예제에서 모든 프로그래밍 문제를 수행했지만 여전히 동일한 누락 된 프로 시저 오류가 발생하고 있다면 문제는 경로 변수에있을 수 있습니다. 아래 단계를 수행하고 다시 실행하십시오.

  1. JAVA_HOME 변수를 JDK 폴더로 설정하는 방법에 대해 확인하십시오 (JRE가 JNI 헤더가 포함되어 있지 않기 때문에 JRE가 아님) 예제 :환경 변수 설정 패널에서 var : java_home val : c : program files java jdk1.7.0_11
  2. 추가하다 %java_home% bin 경로 변수에

이러한 단계를 수행 한 후 응용 프로그램에서 JNI 프로 시저 이름과 JNI.DLL에 대한 링크를 올바른 방식으로 찾을 수 있습니다. 따라서이 누락 된 절차 오류를 다시받지 않기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top