1. 程式人生 > >Java在linux下呼叫C/C++生成的so檔案

Java在linux下呼叫C/C++生成的so檔案

1.
CplusUtil.java是java web工程中的一個工具類
內容如下:
CplusUtil.java

[java] view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. package cn.undoner.utils;  
  2. /** 
  3.  * Created by ${<A HREF="mailto:[email protected]">undoner</A>} on 16-2-25. 
  4.  */
  5. publicclass CplusUtil {  
  6.     publicnativevoid sayHello();  
  7.     static{  
  8.         System.out.println(System.getProperty("java.library.path"
    ));  
  9.         System.load("/usr/lib/jvm/java/jre/lib/amd64/server/MyJni.so");  
  10.     }  
  11.     publicstaticvoid main(String[] args){  
  12.         CplusUtil h = new CplusUtil();  
  13.         h.sayHello();  
  14.     }  
  15. }  





2.
可通過IDE工具(Eclipse/IntellJ/javac等)編譯整個工程,生成相應class檔案
本文路經為:
/工程名/target/classes/cn/undoner/utils/CplusUtil.class



3.為utils所需呼叫的c函式生成相應.h標頭檔案
注意:在有包名情況下,生成.h標頭檔案要記得帶上包名路徑
javah -classpath classes -jni cn.undoner.utils.CplusUtil


生成檔案:cn_undoner_utils_CplusUtil.h
內容如下:
[cpp] view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. /* DO NOT EDIT THIS FILE - it is machine generated */
  2. #include <jni.h>
  3. /* Header for class cn_undoner_utils_CplusUtil */
  4. #ifndef _Included_cn_undoner_utils_CplusUtil
  5. #define _Included_cn_undoner_utils_CplusUtil
  6. #ifdef __cplusplus
  7. extern"C" {  
  8. #endif
  9. /* 
  10.  * Class:     cn_undoner_utils_CplusUtil 
  11.  * Method:    sayHello 
  12.  * Signature: ()V 
  13.  */
  14. JNIEXPORT void JNICALL Java_cn_undoner_utils_CplusUtil_sayHello  
  15.   (JNIEnv *, jobject);  
  16. #ifdef __cplusplus
  17. }  
  18. #endif
  19. #endif



4.編寫c函式
檔案:MyJni.c
內容如下:
[cpp] view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. #include <jni.h>
  2. #include "cn_undoner_utils_CplusUtil.h"
  3. #include <stdio.h>
  4. JNIEXPORT void JNICALL Java_cn_undoner_utils_CplusUtil_sayHello(JNIEnv *env,jobject obj){  
  5.     printf("Hello JNI");  
  6.     return;  
  7. }  



5.
將.c檔案編譯成.o,再重新轉換成.so或者.dll檔案
gcc -fPIC -D_REENTRANT -I /usr/lib/jvm/java/include -I /usr/lib/jvm/java/include/linux -c MyJni.c
生成檔案:MyJni.o


6.
將.o檔案編譯成.so檔案
gcc -shared MyJni.o -o MyJni.so
生成檔案:MyJni.so


7.
本文MyJni.so路徑為:

/usr/lib/jvm/java/jre/lib/amd64/server/MyJni.so

8.
執行CplusUtil.class
在ide中執行CplusUtil或者直接java命令執行:
java cn.undoner.utils.CplusUtil

9.
結果:
/usr/lib/jvm/java/jre/lib/amd64/server:/usr/lib/jvm/java/jre/lib/amd64:/usr/lib/jvm/java/jre/../lib/amd64:/home/vobile/java_tool/idea-IU-141.178.9/bin::/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
Hello JNI


注:System.getProperty("java.library.path")輸出以下資訊為本機的lib路徑:
/usr/lib/jvm/java/jre/lib/amd64/server:/usr/lib/jvm/java/jre/lib/amd64:/usr/lib/jvm/java/jre/../lib/amd64:/home/vobile/java_tool/idea-IU-141.178.9/bin::/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib


相關推薦

通過cmake在Android中呼叫c語言,且生成so檔案

1、  新建JniUtils類實現native方法   2、  在build中執行clean project 再rebuild project 生成class檔案。 注意:最新版本的AndroidStudio中classes檔案的路徑是在\app\build\inter

c編譯,呼叫動態連線庫 (.so檔案)

c編譯,呼叫動態連線庫 (.so檔案) C編譯: 動態連線庫 (.so檔案) Linux動態連結庫.so檔案的命名及用途總結 Linux程式設計練習(二)—— Linux下.so動態庫的建立和呼叫 在“紙上談兵: 演算法與資料結構”中,我在每一篇都會有一個C程式,用於實現演算法和資料

android studio編譯c生成.so檔案

今天練習了用studio編譯c生成.so檔案。 一、首先是配置NDK(以下是以我自己的路徑為例) 二、環境的搭建 設定ndk路徑 成功之後我們可以在local.properties檔案中看到:

Unity使用NDK在Android平臺上引用C++程式碼的so檔案

由於最近進入了公司,手頭上的工作需要一點一點的去適應,所以沒有空來完成接下來的博文,今天突然想到寫一些,發現這麼久沒有接觸了,好像已經忘記了很多,寫下這個博文,我也正好回顧一個這一方面的知識。 關於在unity上使用C++的程式碼需要用到SO檔案了,這就像Cocos上使用C

android studio 編譯C生成.so檔案出現java.lang.UnsatisfiedLinkError

參考文章:http://www.2cto.com/kf/201607/526887.html 這篇文章作者講得很好了,但是我照著做的時候還是不能正常執行程式,總是報java.lang.UnsatisfiedLinkError,其實就是couldn't find "libhuazict.so"

Android studio 使用Cmake完成C/C++ 的使用以及生成so檔案

Android studio 2.2版本以後對C/C++的支援可以說很方便了,當然官方推薦使用Cmake完成對C/C++的支援 2.2版本以上的同學新建一個專案就知道了,步驟如下: File -> New -> New Project,如下圖: 然後勾選

Android Studio2.2.3使用C++生成so檔案

  之前的時候寫過Android Studio2.2.3之前的so庫檔案,之前的版本的so庫檔案的編寫詳見,之前寫過的文章: http://blog.csdn.net/wb175208/article/details/52577167 當再次使用的時候,

android studio ndk-build 編譯C生成.so檔案(ndk基礎篇)

一、概要 最近專案需要,要把程式碼中加密的部分打包成so檔案,剛開始接觸的時候真是痛苦呀,網上好多資料,都不是很詳細,步驟也不清晰,所以我整理了一下,希望大家喜歡。 現在android studio打包so檔案有兩種方式,第一種是ndk-build編譯專案,還有一種用

Dev c++工具將C程式碼生成dll檔案以及如何呼叫dll檔案

該篇文章是對工作中一個需求的總結,工作需求是要將C語言的函式介面,生成一個DLL檔案,讓labview呼叫。然後我嘗試用dev c++開發工具來實現這個功能,後來因為DLL生成了,但labview呼

Unity使用NDK在Android平臺上引用C++程式碼的so檔案(上)

這是我的第一篇博文,在我剛開始實現本文功能是的,感悟真的是挺深的,為了給大家分享我的探索經驗也為了以後自己方便查閱,寫下此篇博文學習一種新的東西,一定要從最簡單的開始,把一切需要實現的功能做到最容易實現的地步,比如說引用外部一個方法,就要把這個方法做到最簡單,比如說這個方法沒

VS2008編譯C語言生成dll檔案

1、在C#中int關鍵字表示一種整型,是32位的,它對應的.NET Framework型別為System.Int32。 int 和 long是標準C#語言的關鍵字,在Microsoft.NET中相當於有一個別名:Int32 和 Int64。 2、編譯生成DLL檔案 1)開啟

Android Studio 簡單生成so檔案呼叫

第1步:新建一個Android Studio 工程 JniHelloWorld。新建一個MyJni.java檔案。 MyJni.java public class MyJni { static { System.loadLi

Android studio執行JNI程式以及生成.so檔案(Windows

呼叫JNI中的方法展示出來的結果 生成的各個平臺的so庫的結果 下面開始進入主題 1、首先是要配置NDK(若是已經配置過NDK請略過此步驟) 建立NDK_HOME 再將配置好的NDK_HOME新增到PATH環境變數中 配置好之後可以測試是否配置正確 ,開啟cmd在裡面輸入ndk

JAVA呼叫動態連結庫so檔案

最近專案在用到openjdk1.8時,出現以下異常,綜其原因是JDK1.8中libjavajpeg.so估計缺少某些函式。 記錄一下,這裡有一篇關於動態連結庫的文章,比較不錯,轉載推薦一下:http://www.cnblogs.com/duanxz/p/3651347.html Exception in t

使用jni生成so檔案後打包失敗問題Binary XML file line #215: Binary XML file line #215

使用jni生成so檔案後打包失敗問題 報錯: 在對專案進行混淆打包後,出現以下報錯:Unable to start activity ComponentInfo{com.infoearth.yfb.unmannedaerialvehicleappas/com.i

linux檢視動態連結庫so檔案的依賴的相關組建

  我們很多c程式在windows下是以dll形式展現的,在linux則是以so 形式展現的。   windows一般不會因為編譯dll檔案的編譯器版本不同而出先dll檔案不能執行。   但是linux下,不同版本核心的linux下編譯的c程式,在其他版本的linux下就容易

ffmpeg2.6.2在Ubuntu使用NDK編譯成.so檔案

參考blog:http://www.cnblogs.com/wainiwann/p/3785485.html 由於需要做視訊播放器,編解碼部分需要用到ffmpeg,沒辦法只能編譯ffmpeg.so 接下來就是參考網上多個ffmpeg的編譯過程,在多次嘗試後終於編譯成功,記

linux檢視動態連結庫so檔案的依賴的相關元件

  我們很多c程式在windows下是以dll形式展現的,在linux則是以so 形式展現的。   windows一般不會因為編譯dll檔案的編譯器版本不同而出先dll檔案不能執行。   但是linux下,不同版本核心的linux下編譯的c程式,在其他版本的linux下就容易出現無法執行的問題。主要可能是支

Linux將多個檔案生成.so檔案

本工程共有三個檔案:myhello.c、myhello.h、Makefile myhello.c程式碼如下: #include <stdio.h> #include <string.h> #include "myhello.h" voi

安卓防破解自用筆記(1)android studio 開發生成so檔案

1. 我這使用的是mac book pro,安裝的Android studio版本在此時此刻還算可以用, 可能不是最新的,但我不要求一定要最新的。為了防止今後看到這個文章跟自己的出現的問題無法對上,我先登記一下我使用的系統版本及as版本號。 2. 在官方或其它渠道下載一