over 2 years ago

最近課業需要查了一下,並且在Mac上弄出來。

第一步

先準備一個Sample1.java

public class Sample1
{
    public native void func1();

    public static void main(String[] args)
    {
        Sample1 sample = new Sample1();
        System.load(args[0] + "/libsample.so"); // 絕對路徑

        sample.func1();
        return;
    }
}

然後

$ javac Sample1.java
$ javah Sample1

第二步

這時會發現除了Sample1.class以外,還有Sample1.h

打開後可以看到

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Sample1 */

#ifndef _Included_Sample1
#define _Included_Sample1
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Sample1
 * Method:    func1
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_Sample1_func1
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

這些是javah自動依照Sample1.java生成的,原因是因為有一個native function

所以這時可以準備一個對應的cpp檔案和func1

#include <cstdio>
#include "Sample1.h"

JNIEXPORT void JNICALL Java_Sample1_func1(JNIEnv* jenv, jobject jobj){
    printf("ok\n");
    return;
}

第三步

這時後就要準備把Sample1.cpp做成libsample.so

$ g++ Sample1.cpp -I"/System/Library/Frameworks/JavaVM.framework/Headers" -c -fPIC
$ g++ Sample1.o -shared -o libsample.so

收工

$ java Sample1 `pwd`
← [筆記][2] Unity Track Device Movement [回顧] 學期結束前的攻略 →
 
comments powered by Disqus