Rodhos Soft

備忘録を兼ねた技術的なメモです。Rofhos SoftではiOSアプリ開発を中心としてAndroid, Webサービス等の開発を承っております。まずはご相談下さい。

cでhelloworld

java側を用意

public class Hello {
    static{
        System.out.println(java.library.path);

        System.loadLibrary("Hello");
    }
    
    static native void printHello();

    public static void main(String args[]){
        printHello();
    }
}

コンパイル

javac Hello.java

C側を作成、ヘッダ作成

javah Hello
#include <jni.h>
/* Header for class Hello */

#ifndef _Included_Hello
#define _Included_Hello
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Hello
 * Method:    printHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_Hello_printHello
    (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif
#include "Hello.h"
#include <stdio.h>

JNIEXPORT void JNICALL Java_Hello_printHello
(JNIEnv *env, jclass obj) {
    printf("hello\n");
}

cをコンパイルするために含めるjniのヘッダーを入れるためjdkの場所を探す。

/usr/libexec/java_home -V

ライブラリ作成

gcc -shared -I/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/include/darwin Hello.c -o libHello.dylib

使うライブラリを実行時に指定して実行

 java -Djava.library.path=. Hello

LD_LIBRARY_PATHに設定すると良い?