native code에서 java class에 접근과 android 난독화(proGuard)

 

// Find the Mat classe
jclass matClass = env->FindClass("org/opencv/core/Mat");

// Get Mat class's methods<getNativeObjAddr()>
jmethodID getNativeObjAddrMethod = env->GetMethodID(matClass, "getNativeObjAddr", "()J");

native code에서 자바 클래스를 액세스 하기위해 java class나 Method를 구하는 경우,

Debug모드에서 잘 동작하던 코드가 Release 모드에서 

JNI DETECTED ERROR IN APPLICATION: JNI NewStringUTF called with pending exception java.lang.NoSuchMethodError: no non=static mathod xxxxxxx

와 같은 에러를 뱉어 내며 Crash나는 현상이 발생할 수 있다.

이러한 에러는 android app 빌드시, 자바 클래스가 난독화 되어 class나 method를 찾지 못하여 발생하는 것으로 보인다.

 

관련 설정은

bundle.gradle(Module: app) 의

buildTypes {
	release {
    	minifyEnabled true 
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 
        }
    }

와 관련된 부분으로

release모드에서만 발생하는 이유는 당연하게도 프로젝트 생성시, release모드에 난독화 활성화 되도록 디폴트로 설정되기 때문이다.

 

release모드에서만 발생하고,

minifyEnabledfalse로 변경했을때 정상적으로 실행된다면 이문제일 확률이 99.9%이다.

 

하지만, 난독화를 아예 비활성 시키기에는 찜찜하니 조그만 더 알아 보자면

난독화는 'proguard-rules.pro'파일에 설정된 내용을 기본으로 반영하므로 해당 파일을 수정해서 특정 Class, method, field등을 난독화 예외 대상으로 지정하면 난독화를 유지한 상태에서 일부 Class만 예외 적용 할 수 있다.

class 전체 예외

-keep class org.opencv.core.Mat { *; }

class 필드 예외

-keep class org.opencv.core.Mat { <fields>; }

class 메소드 예외

-keep class org.opencv.core.Mat { <methods>; }

특정 도메인 이하를 예외하거나 특정 class에서 상속받은 클래스를 예외할 수 있는 방법도 있는 모양이지만,

지금은 귀찮으니 여기까지만 알아본다.

 

*테스트 결과 native코드를 프로젝트에 포함한 경우에는 난독화가 문제가 되지 않았다.

(native코드를 포함한 라이브러리를 다른 프로젝트에서 사용할때 상기의 이슈가 발생함)

 

[bundle.gradle]

signingConfigs {
  release {
    keyAlias 'aliasname'
    keyPassword 'password'
    storeFile file('.jks file path')
    storePassword 'password'
  }
}

buildTypes {
  release {
    debuggable true
    signingConfig signingConfigs.release

    minifyEnabled true
    proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
  }
}

Object-C

확장자

.m : c

.mm : c++

 

헤더 포함

#import "header.h"

 

class

선언

@interface와 @end 사이에 선언

Method

+ : static

- : 일반

+|- (returnType)methodName:(param1Type)param1 param2TypeName:(param2Type)param2

+ (NSString *)analyze:(UIImage *)image info:(NativeResult *)nativeResult;

Property

@property(nonatomic,  strong ) UIImage *image; 

 

구현

@implementation와 @end 사이에 구현

 

Method 호출

+ : [ ClassName MethodName : param1 param2TypeName:param2 ]

- :  [ InstanceName MethodName : param1 param2TypeName:param2 ]

 

샘플

@interface NativeResult : NSObject
+ (NSString *)analyze:(UIImage *)image info:(NativeResult *)nativeResult;

@property(nonatomic,  strong ) UIImage *analyzedImage;

@end

 

@implementation NativeResult 

+ (NSString *)analyze:(UIImage *)image info:(NativeResult *)nativeResult{

            return [NSString stringWithUTF8String:"testresult String];

}

@end

 

NativeResult::analyze()호출

[ NativeResult analyze: image info:nativeResult]

 

 

https://asfirstalways.tistory.com/281

'IOS' 카테고리의 다른 글

Object-C  (0) 2020.07.09

Predefined Macros for OS



1) Windows
_WIN32   Both 32 bit and 64 bit
_WIN64   64 bit only

2) Unix (Linux, *BSD, Mac OS X)
unix
__unix
__unix__ 

3) Mac OS X 
__APPLE__ 
__MACH__ 

4) Linux 
__linux__ 

5) Android 
__ANDROID__

'C++' 카테고리의 다른 글

Cross Compile - Predefined Macros for OS  (0) 2020.06.18
fprintf(),fwprintf()로 한글이 출력되지 않는 문제  (0) 2011.08.11
map 파일  (0) 2011.07.26
Format Specification  (0) 2011.04.20
std::map  (0) 2009.09.03
std::vector  (0) 2009.08.26

[swift]

var vs let

 

[coding]

변수 형 확인 : 변수에 option  + 마우스클릭

정의로 이동 : control + command

주석 : commnad + /

줄 정렬 : command + 'I'

블럭 접기: option + commnad + left arrow

control + command + 'E' : 변수명 한번에 바꾸기

home: command+ <-

end: command + ->

 

[layout]

Object 클릭 + option + Drag : object 복사

option + command + '+' : constraint 업데이트

 

[xcode]

shift + Command + Enter : bottom window toggle

빌드 : command + 'B'

실행: command + 'R'

찾기(파일내): command + 'F'

찾기: command + shift + 'O'

  1. 2020.03.08 18:29

    맥을 사신 모양이네요?

단축키

앱찾기 : command + space 

전체화면 토글  : control + command + F

한영전환 : caps lock  or right command

Backspace: Delete

Delete :  fn + Delete

윈도우 종료 : command + Q

파일삭제 : command + backspace

응용프로그램간 전환 : Command + Tab

동일한 응용프로그램내에 열린 창 전환 : Command + `    

 

화면캡처

전체화면 캡처 : Command + Shift + 3

영역지정 캡처 : command + Shift + 4 + mouse drag

 

트랙패드

손가락 두개 드래그 : 화면 스크롤

손가락 세개 위로 드래그 : 미션 컨트롤

손가락 네개 오므리기 : 런치패드

손가락 네개 좌우 드래그 : 데스크탑 전환

+ Recent posts