『壹』 linux中JNI的no HelloWorld in java library path怎麼解決
我也遇到了一樣的問題 折騰了好久 終於弄清楚了
先找到java.library.path的路徑,用程序輸出System.out.println(Syetem,getProperty("java.library.path"));
之後將libXXX.so復制到上一步輸出的路徑中,之後再loadLibrary(XXX)
運行後就沒有問題了
『貳』 c++的jni動態注冊簡單示例(上)
jni動態注冊是性能最優的方案。寫這個的原因是jni使用的過程中坑比較多,方便此前沒有接觸過的朋友快速構架開發編譯環境。
如果使用jna,只需要通用的c type函數導出的dll就可以了。如果是android使用的話Android studio自帶cmake,這里不多講。
win10 vs2019 cmake-3.19 idea jdk-8( https://adoptopenjdk.net )
任意的gradle/maven工程。
在源碼目錄下新建包com,包下新建CppNative.kt:
同樣的,在com包下新建Native.java:
我們可以編譯此項目,得到class文件,在class目錄下:
在java/main下運行 javah -jni com.Native 得到com_Native.h:
在kotlin/main下運行 javah -jni com.CppNative 得到com_CppNative.h
這是jni靜態映射需要的頭文件。但是動態映射不需要這個頭文件,只需要獲取一些拿不準的方法簽名和參數類型。由於kotlin的實現機制,可以看到kotlin object類實際上是一個單例實現,jni的c函數映射的第二個參數是jobject,而不是橘謹jclass類羨晌型。如果kotlin的object內的方法想要真正的靜態實現只需加入註解: @JvmStatic external fun hello()
在java/main下運行 javap -s com.Native :
在kotlin/main下運行 javap -s com.CppNative :
使用camke的原因是便於跨平台,一般說來我們在linux、windows上都有需求。
使用vs2019(如有需要在visual studio installer上勾選「使用c++的linux開發」,調試linux cpp項目比較方便),新建cmake項目「native-do」:
vs2019默認的cmake項目是一個父CMake項目下包含一個子項目的形式,其實沒有必要改,但是為了在windows:msvc和linux:gcc下能夠編譯同一個項目,簡化項目結構,最終項目結構如下:
這里省略了vs調試方面的工作。
其中的jni.h和jni_md.h由對應的jdk文件復制而來,做動態映射的主圓派基要工作由jni.cpp完成,而native_do.cpp實現具體函數。所有文件都是utf8 LF格式。
參考 https://android.googlesource.com/platform/development/+/master/samples/SimpleJNI/jni/native.cpp
主要注意 classPathName 和 methods 兩個變數,通過 classPathName 指定完整類名(包名+類名), methods 指定方法的映射關系:
native_do.h:
native_do.cpp:
在我們的CMakeLists.txt所在的目錄執行;
cmake -B build -S .
cmake --build build --config Release
cmake -B build -S . -DCMAKE_BUILD_TYPE=Release
cmake --build build
這里只是簡單的映射了列印字元串方法,關於jni引用參數、回調等映射方式放在下章。
『叄』 安卓系統用什麼語言編寫的
android是基於linux的開源操作系統。
linux是使用標准C語言開發的操作系統。
android底層驅動以及操作系統內核使用C語言以及匯編開發。
android操作系統本身是使用Java開發,並使用JNI調用本地的C語言庫,實現操作系統底層調度。
android應用是使用Java開發;同時也可以使用C/C++ native開發,但是多數時候不用用到C。所以基本上就是Java為標准開發語言。
android使用了修改過的JVM(Java虛擬機)叫做dalvik虛擬機,其本質還是Java虛擬機。
所以對應每一個APP都會創建個dalvik虛擬機,也就是一個linux進程。
說復雜了,其實就是基於linux下的修改版Java虛擬機,運行java程序。
『肆』 nx_type.h沒有
因為MAC下 $(SYSROOT)/usr/include調取的是Mac的include (The problem is that the include file in /usr/include are for Mac OS X)
overstack參考
另一個參考
我的方法:
在 android.mk 的LOCAL_C_INCLUDES中去掉$(SYSROOT)/usr/include,
在application.mk中有APP_STL := gnustl_static。
完整文件如下
Android.mk:
[plain] view plainprint?
<code class="language-crystal hljs">LOCAL_PATH := <span class="hljs-variable">$(</span>call my-dir)
<span class="hljs-keyword">include</span> <span class="hljs-variable">$(</span>CLEAR_VARS)
LOCAL_C_INCLUDES += \
<span class="hljs-variable">${</span>NDK_DIR}/sources/cxx-stl/stlport \
<span class="hljs-variable">$(</span>JNI_H_INCLUDE)
LOCAL_SHARED_LIBRARIES += \
libutils
LOCAL_CFLAGS += -O3 -fstrict-aliasing\
-fexceptions -frtti\
-DANDROID_NDK \
-D_STLP_HAS_WCHAR_T \
-DDISABLE_IMPORTGL
LOCAL_MODULE := ddz
LOCAL_SRC_FILES := Socket32.cpp \
GB2Unicode.cpp \
DDzData.cpp \
MD5Checksum.cpp \
biostream.cpp \
TaoJNI.cpp
LOCAL_LDLIBS := -L<span class="hljs-variable">$(</span>SYSROOT)/usr/<span class="hljs-class"><span class="hljs-keyword">lib</span> -<span class="hljs-title">ldl</span> -<span class="hljs-title">llog</span></span>
LOCAL_STATIC_LIBRARIES += -llog\
-L libstlport_static.a
<span class="hljs-keyword">include</span> <span class="hljs-variable">$(</span>BUILD_SHARED_LIBRARY)
</code>
Application.mk:
APP_ABI := armeabi armeabi-v7a
APP_CPPFLAGS += -fexceptions
APP_STL := gnustl_static
APP_CPPFLAGS += -frtti
打開CSDN,閱讀體驗更佳
編譯Android11是遇到kernel出現fatal error: 『linux/compiler_types.h『 file not found
1, 在Ubuntu 20.10環境下編譯Android 11代碼,遇到以下錯誤: kernel/msm-4.19/include/uapi/linux/stddef.h:2:10: fatal error: 'linux/compiler_types.h' file not found #include <linux/compiler_types.h> ^~~~~~~~~~~~~~~~~~~~~~~~ 1 warning and 1 error generated. ...
繼續訪問
處理Matlab Coder, Compiler can't find "tmwtypes.h"
處理找不到"tmwtypes.h" 當我們使用MATLAB生成c代碼用C++項目編譯運行時 可能會出現這樣的編譯問題: can't find "tmwtypes.h" #include "tmwtypes.h" --> 出錯位置 這是因為我們工程文件裡面沒有這個.h頭文件 而這個頭文件是在 MATLAB的安裝路徑 extern\include\ 文件夾下 我們可以找到這個文...
繼續訪問
SQLite第三課 源碼編譯錯誤以及解決
1)fts2 has a designflaw and has been deprecated2)fts1 has a designflaw and has been deprecated解決方案:解析:FTS1和FTS2都有設計的缺陷,現在已經被廢棄,目前已經提供了FTS3或者FTS4,這些作為全文搜索的模塊,彌補了以前的FTS1的不足。如果確定不會使用到全文搜索,可以直接...
繼續訪問
實戰-Android 系統讀取Uboot環境變數實現
系統層讀取Uboot環境變數、實現
繼續訪問
Beego安裝問題:./proc_darwin.h:1:10: fatal error: 'sys/types.h' file not found
問題 在我按照官網的說明安裝beego工具時,發生了以下錯誤 $ go get github.com/beego/bee # github.com/beego/bee/vendor/github.com/derekparker/delve/proc In file included from go/src/github.com/beego/bee/vendor/github.com/derekp...
繼續訪問
RT-Thread 編譯I.MX RT1052時出現無法找到sys/types.h
..\..\..\components\dfs\include\dfs_fs.h(16): error: #5: cannot open source input file "sys/types.h": No such file or directory 下載RTT官方的Gitee上面的LTS版本3.1.3.之後進行編譯出現此問題。發現之後嘗試編譯STM32的程序並沒有出現此問題,粗略看一下源碼是libc部分出現的,此部分和DFS的存儲有直接關系,但是在網上並沒有找到解決方案,感覺可能是電腦的libc庫缺少
繼續訪問
Windows和Mac下獲取(當前)進程內存佔用
Windows下獲取進程內存佔用 #include <process.h> using namespace std; QString getProcessMemory() { QProcess p; int PIDNum = getpid(); p.start("tasklist /FI \"PID EQ " + QString::number(PIDNum) + " \""); p.waitForFinished(); QString result
繼續訪問
全志TinaLinux編譯錯誤fatal error: unicode/ucnv.h: No such file or directory
今天開始正式幹活了 拿到一個全志Tina的板子還有一個SDK壓縮包,要求我這周(只剩一天半。。。)就要把sdk編譯通過並且把板子跑起來。 還特別跟我說他們試了下這個sdk編譯沒法通過,會報錯。。。 竟然是有坑! ———————————————————————————————————————————————————————————————— 准備工作: 拷貝解壓SDK 閱讀Guide手...
繼續訪問
icu 字元串編碼探測及字元串編碼轉換實例
編譯: g++ -o x x.cpp -licuuc -licui18n 請大家確認是否安裝icu庫 #include #include #include #include #include #define BUF_MAX 4096 /* * data, 傳入參數, 需要探測的字元串 * len, 傳入參數, 探測字元串長度 * detected
繼續訪問
linux內核編譯報錯問題code/include/uapi/linux/types.h:5:10: fatal error: asm/types.h: 沒有那個文件或目錄
Linux內核編譯報錯解決辦法
繼續訪問
最新發布 使用SDK中交叉編譯工具鏈clang時,找不到頭文件並且找不到/usr/include、/usr/local/include文件夾
使用SDK中交叉編譯工具鏈clang時,找不到頭文件並且找不到/usr/include、/usr/local/include文件夾 可使用clang++ -E -x c++ - -v < /dev/null命令查看路徑狀態
繼續訪問
/usr/include/sys/types.h基本系統數據類型
https://blog.csdn.net/Rong_Toa/article/details/79254677
繼續訪問
找不到sys/types.h文件
准備下載sys/types.h
繼續訪問
<asm/types.h>在哪裡
在linux中包含頭文件時,有不少類似如下的寫法:#include,但在linuxkernle的include文件夾下並沒有這個文件夾,倒是有不少以asm打頭的文件夾,如:asm_powerpc、asm_ppc等。 #include,是由Makefile根據.config內核配置自動生成的,而用make menuconfig 可以生成.config. 用make mrproper 可以清除.c
繼續訪問
熱門推薦 Linux編程#include <sys/types.h>等一些頭文件在哪裡
在Linux下編寫C程序的時候,對於頭文件的包含會經常有 #include #include 等等這樣的引用。 但是這些文件在哪裡呢? 查找發現 一般在/usr/include這個目錄下。這是gcc的默認頭文件目錄 對於子文件夾會在文件名前面加上子文件的名字這就是為什麼會出現 sys/types.h的原因了
繼續訪問
android 動態庫 如何編譯<sys/types.h>,音視頻學習之NDK交叉編譯基礎
我收集了一些學慣用的資料,其中包含了很多學習,面試,中高進階fluuter資料,還有很多視頻詳解,如果有同學想進一步了解,詳情請看文末。也歡迎各路大神門前來裝X。交叉編譯交叉編譯就是程序的編譯環境和實際運行環境不一致,即在一個平台上生成另一個平台上的可執行代碼。比如NDK,你在Mac、Win或者Linux上生成的C/C++的代碼要在Android平台上運行,就需要使用到交叉編譯了。通俗點說就是你的...
繼續訪問
JNI
Mac
Android NDK
『伍』 java jni 怎麼在windows環境中編譯成linux下的so文件
可以直接在android工程下使用,因為android就是linux內核。
android的NDK開發需要在linux下進行: 因為需要把C/C++編寫的代碼生成能在arm上運行的.so文件,這就需要用到交叉編譯環境,而交叉編譯需要在linux系統下才能完成。
2.安裝android-ndk開發包,這個開發包可以在google android : 通過這個開發包的工具才能將android jni 的C/C++的代碼編譯成庫
3.android應用程序開發環境: 包括eclipse、java、 android sdk、 adt等。
NDK編譯步驟:
選擇 ndk 自帶的例子 hello-jni ,位於E:android-ndk-r5sampleshello-jni( 根據具體的安裝位置而定 ) 。
2.運行 cygwin ,輸入命令 cd /cygdrive/e/android-ndk-r5/samples/hello-jni ,進入到 E:android-ndk-r5sampleshello-jni 目錄。
3.輸入 $NDK/ndk-build ,執行成功後,它會自動生成一個 libs 目錄,把編譯生成的 .so 文件放在裡面。 ($NDK是調用我們之前配置好的環境變數, ndk-build 是調用 ndk 的編譯程序 )
4.此時去 hello-jni 的 libs 目錄下看有沒有生成的 .so 文件,如果有,ndk 就運行正常啦。
『陸』 為什麼java調用jni在linux下通過,但是沒在xp下通過我只是說java,不是android。
有沒有詳細點的錯誤?
一般情況,如果一個平台通桐櫻前過,另頌則一個平台通不過主要有兩方面原因
1,c代碼實現時調用了平台特有的api,局清如linux下面有fork等系統調用,而xp就沒有
2,如果程序沒問題,則可能是配置不對。就是動態庫放置的路徑不對
『柒』 Linux環境下java調用C
你的JNI 寫錯了吧
java里的 char和 C的char完全不是一回事
java里你要寫 stringjava_encryptpswd(string Password, string EncryptedKey );
生成的 C頭文件,應該是 jstring java_encryptpswd(JEnvi* pEnvi,jstring Password,jstring EncryptedKey)
我手寫的,沒查資料握仿尺,大概是這樣。。
然後第一個參數是當大行前虛擬機事例,裡面有很多可用的函數
後面兩個是java里字元串結構,在C裡面的表示法, 其實它就是指針而已。
然後你可以用pEnvi里的函數,將java的string,轉化成 c的string。
然後調用 C的頭文件的函數,得到結果,在組裝成java的字元串。
比如段高例子:
我要用C來實現 java的字元串定位。
No.1 定義java的本地介面
public native String NAConvert(String arg1,String arg2);
No.2 生成頭文件
JNIEXPORT jstring JNICALL Java_com_test_mainandroid_MainAndroidNative_NAConvert
(JNIEnv *, jobject, jstring, jstring);
No.3 自己創建一個實現文件,實現上面函數
jstring Java_com_test_mainandroid_MainAndroidNative_NAConvert
(JNIEnv* env, jobject obj, jstring arg1, jstring arg2)
{
jsize len = env->GetStringLength(arg1);
jchar* pBuf = new jchar[len+1];
env->GetStringRegion(arg1,0,len,pBuf);
jclass m = env->FindClass("java/lang/String");
jmethodID mid = env->GetMethodID(m,"charAt","(I)C");
jchar c = env->CallCharMethod(arg1,mid,1);
return arg1 ;
}
第一個是虛擬機事例指針,第二個參數是介面方法所在對象的 this。
第三個及以後才是你的介面的參數。
java里傳入的所有對象參數,在C裡面都是句柄。必須要用第一個參數env才能解析其中含義。