java.lang.UnsatisfiedLinkError: Native method not found 문제 해결하기

JNI를 쓸 일이 생겨서 JNI 쓰는법을 해보는데

03-05 10:14:50.497: E/AndroidRuntime(17517): java.lang.UnsatisfiedLinkError: Native method not found: com.aaa.bbb.jniMng.getStringJNI:()Ljava/lang/String;

이 에러가 계속남.
인터넷 검색해봐도 대부분의 기본 샘플이 비슷한데 왜 에러가 나는지 모르겠지만 하루종일 삽질하다가 해결법을 찾아서 여기 정리해둠

MainActivity.java

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
package com.aaa.bbb;
import com.examaple.jnitest.R;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity {
jniMng aaa = new jniMng();
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById( R.id.textView1 );
mTextView.setText(aaa.getStringJNI());
}
}
package com.aaa.bbb; import com.examaple.jnitest.R; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends Activity { jniMng aaa = new jniMng(); private TextView mTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextView = (TextView) findViewById( R.id.textView1 ); mTextView.setText(aaa.getStringJNI()); } }
package com.aaa.bbb;

import com.examaple.jnitest.R;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity {
	jniMng aaa = new jniMng();
	private TextView mTextView;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		 mTextView = (TextView) findViewById( R.id.textView1 );
		 mTextView.setText(aaa.getStringJNI());
	}
}

jniMng.cpp

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#include <jni.h>
#include <string.h>
JNIEXPORT jstring JNICALL Java_com_aaa_bbb_jniMng_getStringJNI(JNIEnv *env, jobject object){
return env->NewStringUTF( "This is JNI test :)" );
}
#include <jni.h> #include <string.h> JNIEXPORT jstring JNICALL Java_com_aaa_bbb_jniMng_getStringJNI(JNIEnv *env, jobject object){ return env->NewStringUTF( "This is JNI test :)" ); }
#include <jni.h>
#include <string.h>
JNIEXPORT jstring JNICALL Java_com_aaa_bbb_jniMng_getStringJNI(JNIEnv *env, jobject object){
	return env->NewStringUTF( "This is JNI test :)" );
 
}

jniMng.java

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
package com.aaa.bbb;
public class jniMng {
static{
System.loadLibrary("jniMng");
}
public native String getStringJNI();
}
package com.aaa.bbb; public class jniMng { static{ System.loadLibrary("jniMng"); } public native String getStringJNI(); }
package com.aaa.bbb;

public class jniMng {
	
	static{
		System.loadLibrary("jniMng");
	}
	public native String getStringJNI();
}

일단 문제발생 소스는 위와 같음.

그리고 해결법은 위 jniMng.cpp 를 아래와 같이 바꿔줌.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#include <jni.h>
#include <string.h>
extern "C"{
JNIEXPORT jstring JNICALL Java_com_aaa_bbb_jniMng_getStringJNI(JNIEnv *env, jobject object){
return env->NewStringUTF( "This is JNI test :)" );
}
}
#include <jni.h> #include <string.h> extern "C"{ JNIEXPORT jstring JNICALL Java_com_aaa_bbb_jniMng_getStringJNI(JNIEnv *env, jobject object){ return env->NewStringUTF( "This is JNI test :)" ); } }
#include <jni.h>
#include <string.h>

extern "C"{
	JNIEXPORT jstring JNICALL Java_com_aaa_bbb_jniMng_getStringJNI(JNIEnv *env, jobject object){
		return env->NewStringUTF( "This is JNI test :)" );
	}
}

extern C를 넣어주니 에러가 안나는데 이유를 모르겠음.
NDK 기본 샘플도 extern C가 없는데…


Comments

“java.lang.UnsatisfiedLinkError: Native method not found 문제 해결하기”에 대한 4개의 응답

  1. chiftkey 아바타
    chiftkey

    감사합니다! 동일한 문제로 고생하고 있었는데 덕분에 해결했습니다

    1. Linsoo 아바타

      넵~

  2. canelia 아바타
    canelia

    아마 hello-jni는 c였고, 님 소스는 c++ 형식이 아니었나 싶네요.. 둘이 함수 네이밍 하는 방법이 달라요.
    c는 그냥 하면 되고, c++은 extern “c”를 붙여서 c언어의 형식대로 링크하면 됩니다.

    1. Linsoo 아바타

      넵 그렇군요 감사합니다!

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다