Adroid JNI:no implementation found in native...
JNI:no implementation found in native...
질문
BUG:D/dalvikvm( 1704): Trying to load lib/data/data/com.ulang/lib/libulangaudio.so 0x41052a38D/dalvikvm( 1704): Shared lib '/data/data/com.ulang/lib/libulangaudio.so' already loaded in same CL 0x41052a38W/dalvikvm( 1704): No implementation found for native Lcom/ulang/AudioLib;. sayHelloEx ()Ljava/lang/String;D/AndroidRuntime( 1704): Shutting down VMW/dalvikvm( 1704): threadid=1: thread exiting with uncaught exception (group=0x409961f8)E/AndroidRuntime( 1704): FATAL EXCEPTION: mainE/AndroidRuntime( 1704): java.lang.UnsatisfiedLinkError: sayHelloExE/AndroidRuntime( 1704): at com.ulang.AudioLib.sayHelloEx(Native Method)E/AndroidRuntime( 1704): at com.ulang.One.onClick(One.java:76)E/AndroidRuntime( 1704): at android.view.View.performClick(View.java:3480)E/AndroidRuntime( 1704): at android.view.View$PerformClick.run(View.java:13983)E/AndroidRuntime( 1704): at android.os.Handler.handleCallback(Handler.java:605)E/AndroidRuntime( 1704): at android.os.Handler.dispatchMessage(Handler.java:92)E/AndroidRuntime( 1704): at android.os.Looper.loop(Looper.java:137)에서 두 번째 인자 javah가 jclass로 생성된 것을 발견했기 때문에 오류가 발생했습니다.jobject로 바꾸면 됩니다.Javah는 모든 경우에 두 번째 항목을 jclass로 생성하는 것이 아니라, 때로는 jobject도 생성합니다.NE:각별히 주의하세요!define __cplusplus#ifdef __cplusplusextern "C"{#endif/* * Class: com_ulang_AudioLib * Method: sayHelloEx * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_ulang_AudioLib_sayHelloEx (JNIEnv *, jclass);#ifdef __cplusplus}#endif#endif
두 번째
JNI 인터페이스 호출을 실험할 때 때로는 성공하고 때로는 실행하면 이상한 것을 발견하면 logcat에 알림이 있습니다.
no implementation found in native ....
나중에 인터넷을 검색해 보니 이런 상황이 발생하면 몇 가지 상황이 있을 수 있다는 것을 발견하였다
1.함수 이름 잘못 썼어요.
2.인터페이스 함수를 변경했을 때 프로젝트를 다시 클렌징하고 Rebuild all를 다시 해야 하는지 확인하십시오.
위 두 가지를 확인한 후 JNI 인터페이스에서 호출된 no implementation error가 나타나지 않았습니다.
(2) c++를 실행하여 생성한 것이다.so 라이브러리, 다음 오류를 보고합니다: (함수를 찾을 수 없습니다)
No implementation found for native Lcom/dgut/android/MainActivity;.stringFromJNI ()Ljava/lang/String;
java.lang.UnsatisfiedLinkError: stringFromJNI
at com.dgut.android.MainActivity.stringFromJNI(Native Method)
해결 방법:
자바에서 호출되는 c++ 함수에 extern "C"수식을 추가합니다. 예를 들어: (NDK example의 cpp 파일도 이렇게 설명합니다. Hello-gl2 참조)
extern "C" {
JNIEXPORT jstring JNICALL Java_com_dgut_android_MainActivity_stringFromJNI( JNIEnv* env, jobject thiz );
}
JNIEXPORT jstring JNICALL Java_com_dgut_android_MainActivity_stringFromJNI( JNIEnv* env, jobject thiz )
{
return env->NewStringUTF("Hello from JNI bear c++");
}
이유:
extern "C"로 수식된 변수와 함수는 C 언어로 컴파일되고 연결됩니다.
먼저 C++에서 C와 유사한 함수를 어떻게 컴파일하는지 보십시오. 대상을 대상으로 하는 언어로서 C++는 함수 재부팅을 지원하지만, 프로세스 언어 C는 지원하지 않습니다.함수가 C++로 컴파일된 후 기호 라이브러리의 이름은 C 언어와 다르다.예를 들어 어떤 함수의 원형이:void foo(int x, int y)라고 가정한다.이 함수는 C 컴파일러에 의해 컴파일된 후 기호 라이브러리의 이름은 입니다foo, C++ 컴파일러는 닮은꼴foo_int_int와 같은 이름 (서로 다른 컴파일러가 생성할 수 있는 이름은 다르지만, 모두 같은 메커니즘을 채택하여 생성된 새로운 이름을 'mangled name' 이라고 부른다.)foo_int_int라는 이름은 함수 이름, 함수 매개 변수 수량과 유형 정보를 포함하고 C++는 이런 메커니즘으로 함수 재부팅을 실현한다.예를 들어 C++에서 함수voidfoo(int x, int y)와voidfoo(int x,float y)를 컴파일하여 생성한 기호는 같지 않고 후자는 이다foo_int_float.마찬가지로 C++의 변수는 국부 변수를 지원하는 것 외에 클래스 구성원 변수와 전역 변수도 지원합니다.사용자가 작성한 프로그램의 클래스 구성원 변수는 글로벌 변수와 이름이 같을 수 있습니다.구분하다본질적으로 컴파일러가 컴파일링을 할 때 함수의 처리와 비슷하고 클래스의 변수를 위해 유일무이한 이름을 지었다. 이 이름은 사용자 프로그램에서 같은 이름의 전역 변수 이름과 다르다.
따라서 extern "C"수식 함수를 사용하지 않고 C 언어로 컴파일하고 연결하면 Jni 호출에서 이 함수를 찾을 수 없습니다.
전재 대상:https://blog.51cto.com/laokaddk/1349386
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.