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();
}
일단 문제발생 소스는 위와 같음.
그리고 해결법은 위 jniMng.cpp 를 아래와 같이 바꿔줌.
#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가 없는데…
답글 남기기