NDK를 이용하여 생성한 so 파일을 JNI를 이용하여 접근하려고 합니다만.
오류가 발생하네요.
아무리 살펴봐도 제가 알고 있는 선에서는 이유가 안찾아 져서 글을 올립니다.
제가 작업한 내역은...
1. NDKSampleActivity라는 자바 파일에 native 파일을 선언하고. Javah 명령어를 이용하여 h파일을 생성하였습니다.
-----------------------------------------------------------------------------
자바 Activity Class
-----------------------------------------------------------------------------
public class NDKSampleActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
try
{
System.loadLibrary("ndk-sample");
}
catch(Exception e)
{
int nData=0;
nData++;
nData++;
}//*/
float fValue=0;
fValue=Add();
}
public native float Add();
public native void ClearData();
//static{System.loadLibrary("ndk-sample");}
}
-----------------------------------------------------------------------------
Javah에 의해 생성된 헤더파일
-----------------------------------------------------------------------------
#include <jni.h>
/* Header for class NDKSample_com_NDKSampleActivity */
#ifndef _Included_NDKSample_com_NDKSampleActivity
#define _Included_NDKSample_com_NDKSampleActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: NDKSample_com_NDKSampleActivity
* Method: Add
* Signature: ()F
*/
JNIEXPORT jfloat JNICALL Java_NDKSample_com_NDKSampleActivity_Add
(JNIEnv *, jobject);
/*
* Class: NDKSample_com_NDKSampleActivity
* Method: ClearData
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_NDKSample_com_NDKSampleActivity_ClearData
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
2. jni폴더에 필요한 C함수들을 정리하였습니다.
(1) Sample-jni.cpp에 Javah에 의해 선언된 함수의 샐행부를 기술하였구요.
(2) Sample-jni.cpp의 함수에서 calc.cpp에 있는 함수를 호출하는 형식 입니다.
-----------------------------------------------------------------------------
NDKSample\NDKSample_com_NDKSampleActivity.h에
대응하는 cpp파일
-----------------------------------------------------------------------------
#include <stdio.h>
#include <jni.h>
#include "Include/calc.h"
jfloat
Java_NDKSample_com_NDKSampleActivity_Add(JNIEnv * env, jobject)
{
return GetVersion();
}
-----------------------------------------------------------------------------
#include <stdio.h>
#include "Include/calc.h"
float GetVersion()
{
return 2.3f;
}
3. jni폴더에 Android.mk파일을 생성하여 so파일 생성에 대한 스크립트를 기술하였습니다.
-----------------------------------------------------------------------------
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_MODULE := ndk-sample
LOCAL_SRC_FILES := sample-jni.cpp \
calc.cpp
include $(BUILD_SHARED_LIBRARY)
-----------------------------------------------------------------------------
4. 여기까지 모두 성공하여 so파일도 생성이 되었습니다만. NDKSampleActivity자바 클래서에서 so 함수를 호출하려고 하니...
"No Implementation found for native LNDKSample.com/NSKSampelActivity; .Add ()F" 라는 메시지가 나오는 군요.
분명 LoadLibrary는 성공하였는데...
제가 알기로는 LoadLibrary할때 .mk파일에 적은 LOCAL_MODULE을 파라메타로 보내야하는 것으로 알고 있습니다만.
그리고 확인을 해보려고 System.loadLibrary("ndk-sample"); 부분을 try로 해 보았지만...
디버깅 하면 이 부부은 정상적으 넘어가더군요.
그러다 Add라는 함수를 호출하는 부분에서 이런 문제가 발생하는 군요.
혹시나 또 다른 처리를 해 주여야 하는 것인지요?
아, 그리고 so파일이 생성되어 있는 폴더나, jni 폴더에 대한 것 캡쳐한 것 첨부합니다.
NDK 처음 접근하다 보니, 어려가지 경우를 격는군요.
혹시나 이유를 아시는 분은 꼭 좀 답변 부탁 합니다.
긴 글 읽어 주셔서 감사합니다.
------------------------------------------------------------------------------------
calc.h파일 입니다.
------------------------------------------------------------------------------------
#ifndef __CALC_H__
#define __CALC_H__
float GetVersion();
#endif
------------------------------------------------------------------------------------
그리고 gcc컴파일시는 오류가 나지 않고 있습니다.
그래서 제가 더 원인을 모르겠습니다.
gcc컴파일 메시지도 올려 드립니다.
------------------------------------------------------------------------------------
make: Entering directory `/cygdrive/d/Project/Android/WorkSpace/NDKSample'
Install : libndk-sample.so => libs/armeabi/libndk-sample.so
make: Leaving directory `/cygdrive/d/Project/Android/WorkSpace/NDKSample'
------------------------------------------------------------------------------------




GetVersion() 이름을 다른걸로 해보세요~!!
"Include/calc.h" 요 파일의 내용도 공개해 주셔야 할 것 같네요..