JVM을 호스팅하는 실행 파일에서 JNI C 함수를 호출하려고합니다. -rdynamic으로 컴파일하고 nm -D로 기호가 동적 기호 테이블에 내보내 졌음을 확인했습니다. 그러나 내가 그것을 부를 때 JVM은 기호를 찾을 수 없다고 불평합니다.
나는 과거에 LuaJIT로 이것을 해왔고 그것은 다소 사소한 일이었고 Java로 할 수 없다면 꽤 놀랐을 것입니다.
JNITest 클래스에서 테스트 메서드를 만들었습니다.
public static native int strLen();
그리고 구현 :
#include <jni.h>
#include <java/com_jnitest_JNITest.h>
#include <string>
#include <iostream>
JNIEXPORT jint JNICALL Java_com_jnitest_JNITest_strLen(JNIEnv* env, jclass clazz)
{
return 1111;
}
int main()
{
JNIEnv* env;
JavaVM* jvm;
JavaVMInitArgs args;
JavaVMOption options[1];
args.version = JNI_VERSION_1_8;
args.nOptions = 1;
args.options = options;
args.ignoreUnrecognized = false;
std::string classpath = "-Djava.class.path=";
classpath += "/var/projects/jnitest/src/java";
options[0].optionString = (char*)classpath.c_str();
jint result = JNI_CreateJavaVM(&jvm, (void**)&env, &args);
if (result != JNI_OK) {
std::cerr << "Could not create JVM" << std::endl;
return 1;
}
jclass main_class = env->FindClass("com/jnitest/JNITest");
if (main_class == nullptr) {
std::cerr << "Could not find JNITest class" << std::endl;
return 1;
}
jmethodID main_method = env->GetStaticMethodID(main_class, "main", "()V");
// Call JNITest.main() transferring control to Java
env->CallStaticVoidMethod(main_class, main_method, nullptr);
if(env->ExceptionCheck()) {
env->ExceptionDescribe();
return 1;
}
jvm->DestroyJavaVM();
return 0;
}
JVM은 System.loadLibrary ()로 로드 된 경우 공유 라이브러리 내부의 모든 함수 만 등록합니다 .
프로그램 내부에 JVM을 만들었 으므로이 함수에 대해 알지 못하므로 env-> RegisterNatives (...) 를 사용하여 네이티브 메서드를 Java 클래스와 연결할 수 있습니다.
또한 JNIEXPORT
함수 포인터로 등록하고 외부에서 접근 할 수 있도록 할 필요가 없기 때문에 필요하지 않습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다