macos上使用jni

最近工作中在java工程中通過jni調(diào)用c程序編譯的庫進行加解密,總結(jié)一下jni的用法
環(huán)境:macos 10.12.6,jdk7

  • 編寫一個包含native方法的java文件

System.load()和System.loadLibrary()的區(qū)別可以看這里,簡單來說load是從指定位置加載一個單獨的庫文件(參數(shù)是庫文件的全路徑),loadLibrary是從java.library.path加載庫文件(參數(shù)是文件名,不包括擴展名,macos會自動找lib+文件名+.dylib)。如果庫文件依賴別的庫文件,load需要自己再引入,loadLibrary可以自動在java.library.path找到并引入。可以通過System.getProperty("java.library.path")查看java.library.path路徑是什么,因為loadLibrary對不同平臺的規(guī)則不一樣,所以還是使用load好一點,對名字和文件位置沒有要求

package com.lfz;

import java.io.File;

public class Main {
    static {
        System.load(Main.class.getResource(File.separator).getPath()+"libhelloJNI.dylib");
    }

    public static void main(String[] args) {
        System.out.println(new Main().max(7, 5));
    }

    public native int max(int a, int b);
}
  • 編譯java文件得到class文件

因為我使用的ide自動就會在classpath下編譯java源文件,所以不需要使用javac命令手動編譯

  • 調(diào)用javah命令生成c程序頭文件

進入classpath下執(zhí)行javah命令,注意是后面是完整類名(包名+類名),得到com_lfz_Main.h文件

cd $CLASS_PATH
javah com.lfz.Main
  • 在和com_lfz_Main.h同一目錄下,編輯c文件(名字可以隨便取)

c程序頭文件引入<>和""區(qū)別,可以看這里,簡單來說<>是從系統(tǒng)默認(rèn)的位置找頭文件,""是先從當(dāng)前位置找再去系統(tǒng)默認(rèn)的地方找

#include <jni.h> //引入jni的頭文件
#include "com_lfz_Main.h" //引入剛才產(chǎn)生的h文件
#include <stdio.h>
// 返回值類型jint對應(yīng)java的int類型,方法名規(guī)則:Java_包名_類名_方法名
// 方法參數(shù)前兩個是固定的,之后對應(yīng)java native方法中的參數(shù)類型
JNIEXPORT jint JNICALL Java_com_lfz_Main_max(JNIEnv *env,jobject obj,jint a,jint b){
   return a>b?a:b;
}

  • 使用gcc編譯c源文件得到庫文件

-dynamiclib代表生成動態(tài)庫,-I /System/Library/Frameworks/JavaVM.framework/Headers代表添加額外的頭文件路徑(macos的jni.h在這里,別的os需要修改這里),-o libhelloJNI.dylib代表最后編譯出的庫文件名

gcc -dynamiclib -I /System/Library/Frameworks/JavaVM.framework/Headers helloJNI.c -o libhelloJNI.dylib
類型對應(yīng)圖

對于引用類型則有:jobject, jstring, jthrowable, jclass, jarray, 以及繼承于jarray,對應(yīng)于其原生類型的8種jarray和jobjectarray。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • _ 聲明: 對原文格式以及內(nèi)容做了細微的修改和美化, 主要為了方便閱讀和理解 _ 一. 基礎(chǔ) Java Nativ...
    元亨利貞o閱讀 6,000評論 0 34
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,136評論 25 708
  • 一、NDK產(chǎn)生的背景 Android平臺從誕生起,就已經(jīng)支持C、C++開發(fā)。眾所周知,Android的SDK基于J...
    Ten_Minutes閱讀 3,542評論 1 27
  • 你站在橋上的時候 春天搖搖欲墜, 滿江煙雨,讓春天的骨頭, 銹跡斑斑 我在遠方,守著發(fā)霉的春天。 守著不為人知的每...
    十年秋意閱讀 281評論 3 7
  • 最近看到說雷總造訪線下門店,看到照片非常心酸啊,如圖: 這小米的海報明顯就是臨時的樣子工程啊,被后面的VIVO搶了...
    尼古拉斯_楊閱讀 386評論 0 0