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 명령어로 권한을 변경해주니 정상동작한다.
'IT관련 지식들' 카테고리의 다른 글
시놀로지 나스에 Git 서버 적용하기. (0) | 2021.04.30 |
---|---|
Visual Studio Code에서 Python 코드 작성 및 테스트 (0) | 2020.04.24 |
JNI 사용법 정리 (0) | 2019.09.27 |
JAVA의 기본언어 정리 (0) | 2019.08.06 |
젠킨스(Jenkins) 사용목적 (0) | 2019.08.02 |
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 */ |
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> JNIEXPORT void JNICALL Java_HelloJni_printHello(JNIEnv *env, jobject jobj) { printf("Test Jni process\n"); } |
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}
'IT관련 지식들' 카테고리의 다른 글
Visual Studio Code에서 Python 코드 작성 및 테스트 (0) | 2020.04.24 |
---|---|
git push에러 :: git did not exit cleanly (exit code 1) (0) | 2019.11.21 |
JAVA의 기본언어 정리 (0) | 2019.08.06 |
젠킨스(Jenkins) 사용목적 (0) | 2019.08.02 |
우분투 ftp서버 계정제한 (0) | 2019.05.28 |
자바 컴파일러(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 |