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

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

#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

package com.aaa.bbb;

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

이런 소스였음.

하루를 삽질하다가 찾아낸게

#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 다운받으면 들어있는 hello-jni sample에도 extern C는 없던데

크리에이티브 커먼즈 라이선스Linsoo의 저작물인 이 저작물은(는)크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.

“java.lang.UnsatisfiedLinkError: Native method not found 문제 해결하기”에 대한 2개의 댓글

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

댓글 남기기

이메일은 공개되지 않습니다.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

This site uses Akismet to reduce spam. Learn how your comment data is processed.