IT관련 지식들 2022. 11. 7. 15:08

** 시간설정

-현재 시간 출력

>date 

-현재 시간 변경

>date -s "2022-11-11 09:00:00"

 

** zip 압축 / 압축풀기

-zip으로 압축

>zip [압축파일명] -r [압축파일 경로]

예시)aaa폴더를 a.zip으로 압축

>zip a.zip -r ./aaa

-unzip으로 압축풀기

>unzip [압축파일명]

예시) a.zip 파일을 압축풀기

>unzip a.zip

 

** 문서파일형식 변경

- 파일 형식 확인

>file -bi 파일명

- 파일 형식 변경

>iconv -c -f [원본파일의 인코딩형식] -t [변경할 인코딩형식] 원본파일명 > 변경해서 저장할 파일명

 

예시) a.cpp파일을  iso-8859-1 에서 utf-8로 변경해서 b.cpp에 저장.

>file -bi a.cpp

text/x-c++; charset=iso-8859-1

>iconv -c -f iso-8859-1 -t utf-8 a.cpp > b.cpp

 

** Debian package(deb)파일 설치

- "dpkg -i [설치파일]" 을 실행하면 파일을 복사하는 패키지를 만든다.

>dpkg -i testPacket.deb

- 강제로 설치 "dpkg --force-overwrite -i [설치파일]

>dpkg --force-overwrite -i testPacket.deb

 

** Debian package(deb)파일 만들기

- "dpkg -i [설치파일]" 을 실행하면 파일을 복사하는 패키지를 만든다.

>dpkg-deb --build [작업폴더명]

- 작업폴더는 아래와 같이 구성한 뒤 폴더의 상위폴더에서 명령어를 실행한다.

--의미 : /home/kangmin/Test폴더에 printHelloWorld파일을 복사한다.

--DEBIAN폴더에 있는 파일은 패키지를 설명하거나(control), 패키지 설치 전/후에 실행할 스크립트를 포함한다.

** Debian package(deb)파일 풀기

- 패키지 압축 내용을 푼다. 복사할 폴더가 없으면 새로 생성한다.

>dpkg-deb -x [압축파일명] [압축해제할폴더명]

예시) a.deb파일을 a_dir에 푼다.

>dpkg-deb -x a.deb a_dir

 

** 시리얼포트 동작확인

- 시리얼 포트의 동작 상태를 확인한다.

>stty -F /dev/tty11

 

 

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

C++ compile warning 제거 방법  (0) 2022.12.19
QT 코딩  (0) 2022.11.07
windows 10 가상 데스트톱, 가상 모니터 기능  (4) 2022.01.26
우분투 18.04 qt설치  (0) 2022.01.14
우분투 18.04 실행 USB 만들기  (0) 2022.01.14
posted by 동글동글82
:
IT관련 지식들 2022. 1. 26. 09:31

모니터가 1개밖에 없는데 이 모니터로 전체화면을 출력해야 한다.

원격접속을 해서 보려고 하니 전체화면이 보여서 매번 창을 줄인뒤에 점검을 할 수 밖에 없다.

 

이런 경우를 위해 가상모니터 기능을 검색해 봤다.

 

대부분의 경우 가상모니터는 가상데스트톱 기능을 설명한다.

 

1. 가상데스트톱

아래의 키를 사용하면 하나의 컴퓨터에 2개이상의 데스트톱 처럼 동작할 수 있다.

**********************************

윈도우키 + ctrl + D

윈도우키 + ctrl + 좌우 화살표

윈도우키 + ctrl + F4

윈도우키 + tab

**********************************

위의 키를 모두 기억할 필요 없이 '윈도우키+tab'을 하고 마우스로 컨트롤하면 된다.

 

'윈도우키 + tab' 을 누르면 나오는 화면

이 기능은 내가 찾는 기능이 아니라서 조금 더 찾아보다가 아래 사이트와 파일을 발견했다.

 

2. 가상모니터

usbmmidd_v2.zip
0.19MB

https://www.amyuni.com/forum/viewtopic.php?t=3030

 

Activating a Secondary Display on Windows 10 when no Monitor is Connected - Amyuni Technologies

The Amyuni USB Mobile Monitor allows you to connect your Android mobile phone or tablet to your PC or Linux device with a simple USB Cable. All that is required is the download of the USB Mobile Monitor App on your device and the installation of the USB Mo

www.amyuni.com

영어되어 있지만 간단하게 옮기면

1. 압축파일을 푼다.

2. 'License.txt'를 반드시 읽는다.

3. 관리자권한으로 cmd를 실행해서 압축파일을 푼 폴더로 이동한다.

4. 프로그램을 설치한다.

>deviceinstaller64 install usbmmidd.inf usbmmidd

 프로그램 설치가 잘 되었는지 확인한다.

 

5. 가상모니터를 추가한다.

>deviceinstaller64 enableidd 1

디스플레이 설정에서 모니터가 추가된것을 확인한다.

 

 

6. 가상모니터를 삭제한다.

>deviceinstaller64 enableidd 0

디스플레이 설정에서 모니터가 삭제된것을 확인한다.

 

*32비트의 경우는 deviceinstaller64 대신 deviceinstaller를 사용한다.

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

QT 코딩  (0) 2022.11.07
우분투 명령어  (0) 2022.11.07
우분투 18.04 qt설치  (0) 2022.01.14
우분투 18.04 실행 USB 만들기  (0) 2022.01.14
우분투 DNS서버 설정  (0) 2021.11.17
posted by 동글동글82
:
IT관련 지식들 2022. 1. 14. 11:22

 우분투에서 qt로 프로그램을 할 수 있도록 환경 설정

 

1. qt 5.14.2를 다운로드.

- 이후 버전은 *.run 파일 하나가 아니라 패키지 여러개를 설치해야한다.

- 하나의 파일만 설치하는 가장 높은 버전을 설치했다.

 

파일 다운로드를 하려면 로그인을 해야 된다. 그래서 wget 명령어로 다운로드 한다.

 

wget http://www.download.qt.io.archive/qt/5.14/5.14.2/qt-opensource-linux-x64-5.14.2.run

 

2. 컴파일을 위한 패키지를 설치

sudo apt-get install build-essential
sudo apt-get install qt5-default


3. 파일을 실행

- 실행 권한 추가 후 프로그램 실행.

sudo chmod +x qt-opensource-linux-x64-5.14.2.run
./qt-opensource-linux-x64-5.14.2.run

 

- Qt Account를 입력해야함. (낮은버전도 입력해야 다음으로 넘어감)

- qt관련 설치내용을 전부 선택함. 내용에 맞춰서 필요한 것만 설치해도 됨.

 

4. 프로그램 실행

posted by 동글동글82
:
IT관련 지식들 2022. 1. 14. 11:21

1. 이미지 다운로드

우분투 다운로드 페이지

 

Download Ubuntu Desktop | Download | Ubuntu

Ubuntu is an open source software operating system that runs from the desktop, to the cloud, to all your internet connected things.

ubuntu.com

카카오 미러 사이트

 

https://mirror.kakao.com/

CTAN http(s) Comprehensive TEX Archive Network 24 hours

mirror.kakao.com

 

카카오톡 미러 사이트에서 다운받으면 좀 더 빠르게 받을 수 있다.

 

카카오 미러 사이트

 

 

2. 부팅이미지 생성 프로그램 다운로드

부팅이미지 생성 프로그램 다운로드

 

Rufus - 간편하게 부팅 가능한 USB 드라이브 만들기

간편하게 부팅 가능한 USB 드라이브 만들기 Rufus는 USB 메모리 및 플래시 드라이브를 포맷하고 부팅할 수 있도록 만드는 도구입니다. 이 프로그램은 다음 상황에서 유용하게 사용할 수 있습니다:

rufus.ie

 

 

3. USB에 부팅이미지 생성

 

posted by 동글동글82
:
IT관련 지식들 2021. 11. 17. 09:13

우분투에서 ip를 설정하는 명령어는 ifconfig이고 사용법이 어렵지 않다. 그런데 DNS서버를 설정하는 명령어는 nslookup인데 생각보다 사용법이 어렵다.

 

우분투 UI 우측 상단에 네트워크를 설정하는 버튼이 있다.

 

저 위/아래 화살표를 누르고, 이 후 edit connections를 누르고 현재 사용하는 네트워크를 선택하면 윈도우의 네트워크 설정과 비슷한 화면을 볼 수 있다. 

여기서 dns서버 주소를 변경하면 된다.

실제 적용하려면, 네트워크를 한번 껏다가 켜야하고 네트워크만 껏다켜서 적용되지 않으면 os를 껏다가 키면 적용된다.

posted by 동글동글82
:
IT관련 지식들 2021. 6. 18. 15:04

1. 깃랩 주소에 접근(ID/PW 입력)

2. 첫화면(새프로젝트<New project> 버튼 클릭)

3. 새로운 프로젝트 생성(제목, 설명, 레벨, 초기화옵션 설정)

4. 생성된 프로젝트의 초기화면

-clone클릭하면 링크 복사 가능

5. 프로젝트에 멤버 추가(프로젝트 셋팅 ->  Settings -> members ->"Invite member")

6. 클론 성공

7. 파일복사 후 add

8. Commit & Push

9. 이후 코드 수정이 되면 commit & push. 다른 사람이 수정한 내용을 받아오려면 pull명령으로 동작시킴.

 

6-1. 기존에 작업중이던 폴더와 연결

>git push origin master http://주소:포트 --force

commit의 시점이 맞지 않는다고 해서 --force 옵션을 적용해야 한다. 따라서 git bash를 실행해서 명령을 실행.

 

7-1. 프로젝트 홈페이지에 접속하여 업데이트 내용 확인.

 

posted by 동글동글82
:
IT관련 지식들 2021. 4. 30. 12:35

우분투에서 깃을 사용하다가 HDD가 깨지는 바람에 자료가 다 날라갔다. 이것저것 알아보다가 회사에서 가지고 있던 시놀로지 나스가 있어서 여기에 깃 서버를 설치하기로 했다.

 

1. 깃 서버 설치 및 기본 설정

1-1. 깃 서버 설치

설치된 화면이지만, '모든 패키지'에서 git으로 검색하면 'Git Server'를 쉽게 찾을 수 있다. '설치'버튼을 누르면 수동설정 없이 자동으로 설치를 완료한다.

 

1-2. ssh 서비스 활성화

ssh서비스를 활성화 하고, 보안을 위해 기본포트 22에서 숫자를 변경한다. 저기 밑줄에서 보듯 만약 ssh를 사용하려면 계정이 Administrators 그룹에 속해야 한다. 그리고 계정이 Administrators를 가진다면 ssh로 접근하여 무엇이든 변경할 수 있다. 만약 내부 보안을 지켜야 한다면 ssh를 통한 git 설정은 건너뛰고 GitLab 설치부터 보시길 권한다.

 

1-3. 사용자 홈 서비스 활성화

사용자 홈 서비스를 활성화 한다. 대여섯개의 사이트를 돌아다니며 필요하다고 한 설정을 다 한것이라 이걸 왜 해야하는지는 아직 정확하게 이해하지는 못했다.

 

웹으로 접속해서 하는 내용들이라 따라하기가 어렵지 않다.

 

2. 깃 레포지토리 생성

 레포지토리 초기화를 하고 클론을 해야 하는데 이걸 어떻게 시작해야하는지 몰라 구글에게 '시놀로지 나스 깃 설정'이란 검색어로 검색을 했다.

 

2-1. ssh로 접근

터미널을 통해 서버에 접속한다. 저는 putty를 사용했습니다. 생성한 ID/PW가 있으면 ID/PW를 입력하여 접속합니다. 생성한 것이 없다면 관리자 권한으로 접속합니다.

 

2-2. 폴더 생성 및 초기화

초기화 할 폴더를 생성하고 깃 초기화를 적용합니다.

 

cd /var/services/homes/gituser

==> 저장소를 생성할 위치로 이동. '/volume2/homes/gituser'로 이동해도 경로가 같다.

mkdir testGit

cd testGit

==> 폴더생성

==> 폴더로 이동

git init --bare

==> 깃 초기화

cd..

chown -R gituser:user testGit

==> 폴더 이동 후 폴더 내 파일의 권한 변경.  chown명령에 권한이 없다고 하면, sudo 를 앞에 붙인다.

 

3. 윈도우에서 tortoiseGit으로 접속.

tortoiesGit설치 (여기에서 다운로드)

설치는 원하는 폴더로 이동

우클릭하여 git->clone을 선택

경로는 ssh://gituser@192.168.1.2:22/var/services/homes/gituser/testGit

경로에 대해 간단히 설명하면 "ssh://유저ID@서버IP:서버포트 경로"

우분투에 설치했던 git에서는 ssh://를 생략했는데, 이부분을 쓰지 않아서 하루정도 고생했다.

 

다시 한 번 이야기하지만, 이 경우에는 시놀로지 나스의 보안정책에 의해 gituser란 사용자가 관리자 그룹에 속해야 한다. 이는 사용자가 ssh로 접속하거나, 웹으로 접근해서도 관리자 권한을 가지고 있기 때문에 보안에 취약해진다. 개인이나 소그룹의 경우는 괜찮지만, 기업이나 여러명이 접속해야하는 경우에는 아래의 Git Lab을 사용하길 추천한다.

 

4. Git Lab설치

4-1. 패키지 설치

시놀로지 웹으로 접속해서 패키지 센터에 접근하면, Git Lab이 있다. 설치를 누르면 도커(docker)에 설치를 하고 추가로 필요한 프로그램을 자동으로 설치한다. 설치를 하면서 필요한 설정들이 있는데 대부분 직관적으로 무슨 의미인지 알 수 있는 값이다. 혹시 이 과정에서 모르는 설정값이 많다면 구글에서 '시놀로지 나스 깃 랩 설정'으로 찾아서 화면 캡처가 많은 페이지를 참고하기 바란다.

 

4-2. 도커에서 확인

synology_gitlab을 설치했더니, postGresql과 redis란 컨테이너를 추가로 설치한다.

 

4-3. 접속 포트 확인

도커에서 컨테이너 -> synology_gitlab 우클릭 -> 세부사항을 누르면 위의 사진처럼 뜬다. 왼쪽 아래에 포트설정에 표시된 로컬포트를 기억한다.

 

5. Git Lab 접속 및 초기설정

5-1. Git Lab 웹페이지 접속

웹브라우저에서 'http://192.168.1.2(서버IP):30000(접속포트)'로 접속하면 접속화면이 나온다. 최초 접속시 비밀번호를 입력하는 화면이 나오고, 이 비밀번호와 초기 아이디(root)로 접속할 수 있다.

 

5-2. 프로젝트 생성

 

초기화면이 위와 같이 나오면 'Create a project'를 눌러 새로운 프로젝트를 만든다.

 

Project name

    -빈 프로젝트를 만들면서 프로젝트 이름을 적는다.

Project URL

    -프로젝트의 URL은 자동으로 생성된다. 

Project description

    -프로젝트의 설명을 간단히 적는다.

Visibility Level

    -직역을 해서 적어보기는 하는데, public을 하는게 제일 편하고, private를 선택해서 ssh key까지는 등록해봤다.

    -private : 접속에 권한이 필요하다. ssh key등록 등의 절차가 필요하다.

    -internal :  로그인한 사용자만 접속이 가능하다.

    -public : 권한 없이 접속이 가능한다.

Initaialize repository with a README

    -클론으로 저장소를 받은 후 push할 때, 데이터가 안 올라가는 경우가 있다. 정확한 원리는 잘 모르지만, 이 항목을 선택하면 데이터가 올라간다.

 

깃랩의 초기설정과 기능에 대해서는 조금 더 확인하고 검토 후 추가하고자 한다.

 

posted by 동글동글82
:
IT관련 지식들 2020. 4. 24. 17:11

먼저 Visual Studio Code를 다운받아 설치한다.

 

이후 파이썬을 사용하기 위해서 아래 블로그를 참조했다.

 

https://evols-atirev.tistory.com/31

 

Visual Studio Code Python 사용법

Visual Studio Code 상에서 파이썬 코드를 실행시키고 디버깅하는 방법에 대한 글이다. 우선 파이썬과 Vscode를 설치해준다. Vscode의 설치는 https://evols-atirev.tistory.com/4를 참고해서 설치해준다. Python..

evols-atirev.tistory.com

1. Visual Stdio Code 실행

 

2. open folder선택. 작업을 진행할 폴더를 선택한다.

3. 작업을 진행할 폴더에 새로 파일을 입력한다. (여기서는 helloWorld.py)

- 만약, Visual Studio Code에 Python이 설치되거나 연결되지 않았으면 설치하라는 메시지가 나온다.

- 안내 메시지에 따라 설치하면 된다.

4. 디버깅을 위해 run(F5)를 동작한다.

- launch.json파일을 자동으로 생성해준다.

- 위에 링크된 블로그에서 미리 작성한 코드가 있어 "작업폴더\.vscode"에 task.json과 setting.json 파일을 복사해 넣었다.

4-1. tasks.json

-아래와 같이 작성한다.

{

    // See https://go.microsoft.com/fwlink/?LinkId=733558

    // for the documentation about the tasks.json format

    "version""2.0.0",

    "tasks": [

        {

            "label""python3",

            "type""shell",

            "command":"python",

            "args":["${file}"],

            "group":{

                "kind":"build",

                "isDefault":true

            },

            "presentation":{

                "echo":true,

                "reveal":"always",

                "focus":false,

                "panel":"shared",

                "showReuseMessage":true,

                "clear":true

            }

        }

    ]

}

4-2. setting.json

- 파이썬 실행파일이 설치된 위치를 찾아서 넣어준다.

{

    "python.pythonPath""E:\\Microsoft Visual Studio\\Shared\\Python37_64\\python.exe"

}

 

5. run(F5)를 다시 동작한다.

- Debug Configuration으로 Python File을 선택한다.

- 밑에 콘솔창에서 결과를 볼 수 있다.

posted by 동글동글82
:
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
: