2017-05-16 4 views
0

저는 NDK를 사용하여 Android에 Android Shapefile 리더 앱을 만들고 있습니다. 셰이프 파일을 구문 분석하는 데 C++을 사용하려고합니다. 라이브러리 "Shapefile C Library"를 찾았습니다. 기둥 : https://github.com/sw897/shapelib. http://shapelib.maptools.org/shp_api.htmlAndroid, NDK로 외부 라이브러리 가져 오기

모든 팁 :

어떻게 그래서 난에 설명 된 기능을 사용할 수 있습니다 내 안드로이드 프로젝트에 가져 오는 아무 생각을 한 안드로이드 스튜디오를 사용하지 않고 무엇입니까?

+0

다른 C 코드에서 사용하는 경우 C 코드와 연결해야합니다. Java에서 사용하는 경우에는 C 코드로 JNI 랩퍼를 작성하고 Java 기능을 일치시켜야합니다. –

답변

1

첫째, 구글에서 떨어져 안녕하세요 - JNI의 예에서 해킹 시작 : https://github.com/googlesamples/android-ndk/tree/master/hello-jni

사용하는 테스트 베드한다.

그런 다음 라이브러리와 상호 작용할 수있는 public native 메소드가있는 Java 클래스를 만듭니다. 뭔가 높은 수준의 API, 아마 SHPOpenLL에 파일 이름이나 버퍼를 전달하고 ShapeFile 컨텍스트 (ShapeHandle)에 대한 포인터를 반환합니다. 라이브러리가 C로 작성된 것 같아서 ShapeHandle 포인터의 (jint) C 스타일 캐스트를 전달하는 셰이프 파일을 쿼리하는 유사한 인터페이스를 작성할 수 있어야합니다.

다음으로 모양 파일 인터페이스의 헤더를 생성하려면 javah으로 재생해야합니다. 헤더가 생성되면이 헤더를 사용하여 .cc 파일로 인터페이스를 구현할 수 있습니다. 거기에서 기본적으로 C 인터페이스로 Java 호출을하고 jobject를 리턴합니다. (jint를, jbool, jstring으로, 등등 ...)


내가 사용하려는 ShapeLib 찾고 있어요 그것은 충분히 쉽게하지만, 일부 개는있을 것입니다.

  • 파일 I/O에 대해 SAHooks을 구현해야합니다. APK 파일 (또는 다운로드 한 파일)에 액세스하는 방법에 대한 예제는 NVFile을 참조하십시오. activity.context.assetmanager를 사용하여 초기화해야합니다. 그런 다음 nv_file을 사용하여 FRead/FSeek/etc를 래핑하십시오.
  • 정보를 Java로 전달하는 것은 어려울 것입니다. 개인적으로, 모양 정보를 보유하고 C쪽에 채울 Java 클래스를 작성합니다. 그러나 한 번에 하나씩 SHPObject에서 이러한 매개 변수를 쿼리하려는 유혹을받을 수 있습니다. 느리지 만 오류가 발생하기 쉽습니다.

예.

// Java 
MyJavaShapeObject obj = new MyJavaShapeObject(); 
_c_retrieveShapeObj((jint)pShapeFile, obj); 

// C 
java_blah_blah_c_retrieveShapeObj(JNIEnv* env, jclass activity, jint theShapeFile, jobject theObj){ 
    ShapeHandle pShapeFileHandle = (ShapeHandle)theShapeFile; // c style conversion 
    // http://stackoverflow.com/questions/11647646/how-to-use-the-jni-to-change-the-fields-of-a-java-class 
    // http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html#wp16613 
    // http://stackoverflow.com/a/36759159/7949696 
}