IT관련 지식들 2019. 11. 21. 14:42

git push를 하다가 같은 에러가 계속나서 찾아봤다.

 

git.exe push --progress "origin" master:master 
Enumerating objects: 366, done. 
Counting objects: 100% (366/366), done. 
Delta compression using up to 8 threads 
Compressing objects: 100% (361/361), done. 
Writing objects: 100% (364/364), 1.82 MiB | 7.53 MiB/s, done. 
Total 364 (delta 223), reused 0 (delta 0) 
remote: error: Cannot update the ref 'refs/heads/master': unable to append to logs/refs/heads/master: 허가 거부 
To 221.132.85.22:/home/npdgit/gitrepository/emulatorServer 
! [remote rejected] master -> master (failed to update ref) 
error: failed to push some refs to 'khkwon@221.132.85.22:/home/npdgit/gitrepository/emulatorServer' 

git did not exit cleanly (exit code 1) 
에러가 발생했습니다!! (4109 ms @ 2019-11-21 오후 1:35:38)

인터넷에 있는 많은 방법을 사용했지만 해결되지 않았고, 다시 읽어보니 보인 문장이 "허가 거부".

 

다른 사람이 쓰도록 테스트하던 도중 첫 update를 내가 해서 master파일이 내 이름으로 생성된 것이였다.

 

chown 명령어로 권한을 변경해주니 정상동작한다.

posted by 동글동글82
:
IT관련 지식들 2019. 9. 27. 11:00

C/C++로 제작한 모듈을 java에서 불러 쓸 일이 생겨서 어떻게 해야하는지 정리했다.

만약, 불러올 수 있는 동적라이브러리가 있다면 2~5를 생략해도 된다. 단, 메서드 혹은 API를 알고 있어야한다.

 

1. HelloJni.java 파일 생성

  - 라이브러리를 load하는 클래스

class HelloJni{
static { System.loadLibrary("hellojni");}
  native void printHello();
  native void addintiger(int var1, int var2);
  native int sumIntiger(int[] intData);
  native byte sumByte(byte[] byteData);
  native void printString(String str);
  native void getByteData(byte[] getByte);
  native int setByteArray(byte[] ptData);
  native byte[] makeByteArray(int len);
  native byte[] makeNsetBArray(int len);
}

 

2. java컴파일 HelloJni.class 파일 생성

$javac HelloJni.java

==> HelloJni.class파일 생성.

 

3. HelloJni.h C/C++ 헤더파일 생성.

$javah -jni HelloJni

==> HelloJni.h 파일 생성. 자동으로 만들어지니 참고만 할 것.

/* DO NOT EDIT THIS FILE - it is machine generated */
#include 
/* Header for class HelloJni */
#ifndef _Included_HelloJni
#define _Included_HelloJni
#ifdef __cplusplus
extern "C" {
#endif
/* * Class:     HelloJni * Method:    printHello * Signature: ()V */
JNIEXPORT void JNICALL Java_HelloJni_printHello  (JNIEnv *, jobject);
/* * Class:     HelloJni * Method:    addintiger * Signature: (II)V */
JNIEXPORT void JNICALL Java_HelloJni_addintiger  (JNIEnv *, jobject, jint, jint);
/* * Class:     HelloJni * Method:    sumIntiger * Signature: ([I)I */
JNIEXPORT jint JNICALL Java_HelloJni_sumIntiger  (JNIEnv *, jobject, jintArray);
/* * Class:     HelloJni * Method:    sumByte * Signature: ([B)B */
JNIEXPORT jbyte JNICALL Java_HelloJni_sumByte  (JNIEnv *, jobject, jbyteArray);
/* * Class:     HelloJni * Method:    printString * Signature: (Ljava/lang/String;)V */
JNIEXPORT void JNICALL Java_HelloJni_printString  (JNIEnv *, jobject, jstring);
/* * Class:     HelloJni * Method:    getByteData * Signature: ([B)V */
JNIEXPORT void JNICALL Java_HelloJni_getByteData  (JNIEnv *, jobject, jbyteArray);
/* * Class:     HelloJni * Method:    setByteArray * Signature: ([B)I */
JNIEXPORT jint JNICALL Java_HelloJni_setByteArray  (JNIEnv *, jobject, jbyteArray);
/* * Class:     HelloJni * Method:    makeByteArray * Signature: (I)[B */
JNIEXPORT jbyteArray JNICALL Java_HelloJni_makeByteArray  (JNIEnv *, jobject, jint);
/* * Class:     HelloJni * Method:    makeNsetBArray * Signature: (I)[B */
JNIEXPORT jbyteArray JNICALL Java_HelloJni_makeNsetBArray  (JNIEnv *, jobject, jint);
#ifdef __cplusplus
}
#endif
#endif

 

  3.1 Class를 찾을 수 없다고 나올 때.

    - classpath를 설정하라는 조언과 package의 전체 이름을 입력하라는 조언 둘다 안됨.

 

 

    - src 폴더로 내려가서 package이름으로 실행하니 성공.

  3.2 헤더를 생성하는 경로에 따라 함수이름이 달라짐.

 

4. 생성된 헤더파일에 맞춰 C/C++ 파일 생성.

==> 헤더파일의 메서드/API만 복사하여 내용을 채워넣음.

==> Falinux 포럼의 JNI 배열관련 글을 참고.

http://forum.falinux.com/zbxe/index.php?document_srl=570993&mid=lecture_tip

#include "HelloJni.h"

#include <stdio.h>
#include <jni.h>
#include <stdlib.h>
#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT void JNICALL Java_HelloJni_printHello(JNIEnv *env, jobject jobj)

{  printf("Test Jni process\n"); }

JNIEXPORT void JNICALL Java_HelloJni_addintiger(JNIEnv *env, jobject jobj, jint var1, jint var2)
{ printf("%d + %d = %d\n",var1,var2,var1+var2); }

JNIEXPORT jint JNICALL Java_HelloJni_sumIntiger(JNIEnv *env, jobject jobj, jintArray intData)
{
  jint *intBuf;
  int size;
  int sum, i;
  size = env->GetArrayLength(intData);
  intBuf = env->GetIntArrayElements(intData, NULL);
  sum = 0;
  for(i=0 ; i < size ; i++){
    sum += intBuf[i]*10;
    printf("array[%d] = %d, sum = %d\n",i,intBuf[i],sum);
  }
  env->ReleaseIntArrayElements(intData, intBuf, 0);
  return sum; 
}

JNIEXPORT jbyte JNICALL Java_HelloJni_sumByte(JNIEnv *env, jobject jobj, jbyteArray byteData)
{
  jbyte *byteBuf;
  int size, i;
  char sum;
  size = env->GetArrayLength(byteData);
  byteBuf = env->GetByteArrayElements(byteData, NULL);
  sum = 0;
  for(i=0 ; i < size ; i++){
    sum += byteBuf[i];
    printf("array[%d] = %d, sum = %d\n",i,byteBuf[i],sum);
  }
  env->ReleaseByteArrayElements(byteData, byteBuf, 0);
  return sum;
}

JNIEXPORT void JNICALL Java_HelloJni_printString(JNIEnv *env, jobject jobj, jstring jstr)
{
  const char *str = env->GetStringUTFChars(jstr,NULL);
  printf("String is[%s]\n",str);
  env->ReleaseStringUTFChars(jstr,str);
}

JNIEXPORT void JNICALL Java_HelloJni_getByteData(JNIEnv *env, jobject jobj, jbyteArray byteData)
{
  jbyte *byteBuf;
  int size, i;
  size = env->GetArrayLength(byteData);
  byteBuf = env->GetByteArrayElements(byteData, NULL);
  for(i=0 ; i < size ; i++){
    byteBuf[i] = i*2;
  }
  env->SetByteArrayRegion(byteData, 0, 10, (const jbyte *)byteBuf);
  env->ReleaseByteArrayElements(byteData, byteBuf, 0);
}

JNIEXPORT jint JNICALL Java_HelloJni_setByteArray(JNIEnv *env, jobject jobj, jbyteArray byteData)
{
  jint mallocSize;
  jbyte *byteBuf;
  int i;

  mallocSize = 20;

  byteBuf = env->GetByteArrayElements(byteData, NULL);
  for(i=0 ; i < mallocSize ; i++){
   byteBuf[i] = i*3;
  }
  env->SetByteArrayRegion(byteData, 0, mallocSize, (const jbyte *)byteBuf);
  return mallocSize;
}

JNIEXPORT jbyteArray JNICALL Java_HelloJni_makeByteArray(JNIEnv *env, jobject jobj, jint len)
{
  jbyteArray bytePt = NULL;
  jbyte *byteBuf;
  int i;

  bytePt = env->NewByteArray(len);

  if(bytePt != NULL){
    printf("make new byte array\n");
    return bytePt;
  }
  else{
    printf("make fail\n");
    return NULL;
  }
}

JNIEXPORT jbyteArray JNICALL Java_HelloJni_makeNsetBArray(JNIEnv *env, jobject jobj, jint len)
{
  jbyteArray bytePt = NULL;
  jbyte *byteBuf;
  int i;

  bytePt = env->NewByteArray(len);

  if(bytePt != NULL){
    printf("make new byte array\n");

    byteBuf = (jbyte *)malloc(sizeof(jbyte)*len);
    for(i=0 ; i < len ; i++){
      byteBuf[i] = i*4;
    }
    env->SetByteArrayRegion(bytePt, 0 , len, (const jbyte *)byteBuf);
    free(byteBuf);
    return bytePt;
  }
  else{
    printf("make fail\n");
    return NULL;
  }
}

#ifdef __cplusplus
}
#endif

 

5. 라이브러리 생성.

5-1. linux 64bits

$gcc -m64 -fPIC -shared -o libhellojni.so HelloJni.cpp -I/usr/lib/java/jdk/include -I/usr/lib/java/jdk/include/linux

 

5-2. linux 32bits

$gcc -m32 -shared -o libhellojni.so HelloJni.cpp -I/usr/lib/java/jdk/include -I/usr/lib/java/jdk/include/linux

 

5-3. 라즈베리파이등 (coretex-arm)

==> 크로스컴파일러가 없다면 "apt-get install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf"

$arm-linux-gnueabihf-g++ -fPIC -shared -o libhellojni.so HelloJni.cpp -I/usr/lib/java/jdk/include -I/usr/lib/java/jdk/include/linux

$readelf -hA libhellojni.so

Tag_CPU_arch: v7

 

5-4. arm코어가 다른 보드.

==> 크로스컴파일러가 없다면 "apt-get install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi"
$arm-linux-gnueabi-g++ -shared -o libhellojni.so HelloJni.cpp -I/usr/lib/java/jdk/include -I/usr/lib/java/jdk/include/linux
$readelf -hA libhellojni.so
Tag_CPU_arch: v5T

 

6. 동적라이브러리 복사.

$sudo cp libhellojni.so /usr/lib/

6-1. 동적라이브러리 파일 복사를 안하려면, 동적라이브러리 PATH를 설정하는 방법도 있다. 아래 파일의 제일 밑에 LD_LIBRARY_PATH를 추가해서 잘되긴 했는데, 타겟보드에서는 실패했다.

$vi /etc/profile

export LD_LIBRARY_PATH=/home/user_name/mylib:${LD_LIBRARY_PATH}

 

posted by 동글동글82
:
IT관련 지식들 2019. 8. 6. 11:48

자바 컴파일러(javac)

- 자바 코드를 실행시킬 수 있는 프로그램으로 변경.

자바 런처(java)

- JVM(Java Virtual Machine)을 통해 컴파일된 프로그램을 실행.

자바 바이트코드(Java Bytecode)

- 자바 컴파일러에 의해서 생성되는 코드. 명령어의 크기가 1Byte이기 때문에 붙여진 이름.

자바 버추얼 머신

- 각 OS에서 자바를 실행시키기 위해서 설치한 소프트웨어

클래스

- 객체를 생성하기 위한 '틀'

- 변수와 메소드를 가지고 있음.

메소드

- c언어에서 함수와 같은 뜻.

변수

- 데이터의 저장과 참조를 위해 할당된 메모리 공간

선언(declaration)

- 컴파일러에게 무엇인가를 알리는 행위

MSB(Most Significant Bit)

LSB(Least Significant Bit)

- MSB First, LSB First까지 붙여서 사용한다. 메모리에 저장할 때, 어떤 비트부터 저장하는지에 대한 정의.

char형 변수

- 유니코드 저장을 위해 1~2bytes가 가변적으로 할당됨.

상수( = literal)

- 메모리에 값이 저장되지만, 저장된 값의 변경은 불가능.

자료형의 변환

- 연산을 위해 더 넓은 자료형으로 자동 형 변환(Implicit Conversion)이 일어남.

- byte->short->int->long->float->double

Short-Circuit Evaluation(SCE)

- 가장 빠르게 연산을 진행하기 위한 계산방식

final

- c언어에서 const와 비슷한 뜻으로 딱 한번 초기화를 할 수 있는 변수. 변수타입 앞에 선언.

인스턴스(instance)

- new명령어로 생성된 객체

생성자(Constructor)

- 인스턴스가 생성될 때, 초기화를 같이 진행하는 메소드

 

'IT관련 지식들' 카테고리의 다른 글

git push에러 :: git did not exit cleanly (exit code 1)  (0) 2019.11.21
JNI 사용법 정리  (0) 2019.09.27
젠킨스(Jenkins) 사용목적  (0) 2019.08.02
우분투 ftp서버 계정제한  (0) 2019.05.28
우분투 VNC server 설치  (0) 2019.01.22
posted by 동글동글82
: