日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

linux下JNI的demo

發(fā)布時(shí)間:2025/1/21 linux 75 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux下JNI的demo 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
java訪問(wèn)C/C++有6步
1.寫(xiě)java文件
2.編譯java生成class
3.生成C/C++頭文件。
4.寫(xiě)C/C++文件
5.編譯生成dll(Window下)或so文件
6.運(yùn)行java程序
下面介紹ubutun下一個(gè)JNI例子

1.編寫(xiě)Sample1.java文件:

?? public class Sample1 { public native int intMethod(int n); public native boolean booleanMethod(boolean bool); public native String stringMethod(String text); public native int intArrayMethod(int[] intArray); public static void main(String[] args) { System.loadLibrary("Sample1"); Sample1 sample = new Sample1(); int square = sample.intMethod(5); boolean bool = sample.booleanMethod(true); String text = sample.stringMethod("JAVA"); int sum = sample.intArrayMethod( new int[]{1,1,2,3,5,8,13} ); System.out.println("intMethod: " + square); System.out.println("booleanMethod: " + bool); System.out.println("stringMethod: " + text); System.out.println("intArrayMethod: " + sum); } }

?兩個(gè)地方要注意,
?一。上面的方法都用到了native關(guān)鍵字。
?二。System.loadLibrary("Sample1");這句中"Sample1"是我們?cè)诘?步中得到的庫(kù)的名字,在window下是"Sample1.dll",在unix下要加前綴"lib",即"libSample1.so"。
?
2.編譯java文件:
javac ?Sample1.java
? ? 無(wú)錯(cuò)生成Sample1.class文件
3.生成C/C++頭文件
javah ?Sample1
? ? 生成Sample1.h
使用命令 cat ?Sample1.h 查看,內(nèi)容為:

/* 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 JNIEXPORT jint JNICALL Java_Sample1_intMethod (JNIEnv *, jobject, jint); JNIEXPORT jboolean JNICALL Java_Sample1_booleanMethod (JNIEnv *, jobject, jboolean); JNIEXPORT jstring JNICALL Java_Sample1_stringMethod (JNIEnv *, jobject, jstring); JNIEXPORT jint JNICALL Java_Sample1_intArrayMethod (JNIEnv *, jobject, jintArray); #ifdef __cplusplus } #endif #endif
?我們可以對(duì)比看看java文件中對(duì)應(yīng)的方法


?4.編寫(xiě)C/C++代碼

???Sample1.c:

?#include "Sample1.h" #include <string.h> JNIEXPORT jint JNICALL Java_Sample1_intMethod (JNIEnv *env, jobject obj, jint num) { return num * num; } JNIEXPORT jboolean JNICALL Java_Sample1_booleanMethod (JNIEnv *env, jobject obj, jboolean boolean) { return !boolean; } JNIEXPORT jstring JNICALL Java_Sample1_stringMethod (JNIEnv *env, jobject obj, jstring string) { const char *str = (*env)->GetStringUTFChars(env, strin char cap[128]; strcpy(cap, str); (*env)->ReleaseStringUTFChars(env, string, str); return (*env)->NewStringUTF(env, strupr(cap)); } JNIEXPORT jint JNICALL Java_Sample1_intArrayMethod (JNIEnv *env, jobject obj, jintArray array) { int i, sum = 0; jsize len = (*env)->GetArrayLength(env, array); jint *body = (*env)->GetIntArrayElements(env, array, 0 for (i=0; i<len; i++) { sum += body[i]; } (*env)->ReleaseIntArrayElements(env, array, body, 0); return sum; } void main(){}

Sample1.cpp:#include "Sample1.h" #include <string.h> NIEXPORT jint JNICALL Java_Sample1_intMethod (JNIEnv *env, jobject obj, jint num) { return num * num; } JNIEXPORT jboolean JNICALL Java_Sample1_booleanMethod (JNIEnv *env, jobject obj, jboolean boolean) { return !boolean; } JNIEXPORT jstring JNICALL Java_Sample1_stringMethod (JNIEnv *env, jobject obj, jstring string) { const char *str = env->GetStringUTFChars(string, 0); char cap[128]; strcpy(cap, str); env->ReleaseStringUTFChars(string, str); return env->NewStringUTF(strupr(cap)); } JNIEXPORT jint JNICALL Java_Sample1_intArrayMethod (JNIEnv *env, jobject obj, jintArray array) { int i, sum = 0; jsize len = env->GetArrayLength(array); jint *body = env->GetIntArrayElements(array, 0); for (i=0; i<len; i++) { sum += body[i]; } env->ReleaseIntArrayElements(array, body, 0); return sum; } void main(){}
兩個(gè)差別就是JNIEnv這個(gè)類(lèi)
? C中使用 jsize len = (*env)->GetArrayLength(env,array);
? C++中使用 jsize len = env->GetArrayLength(env,array); ?
?
5.生成共享庫(kù)文件
?編譯Sample1.c文件
?gcc -fPIC -D_REENTRANT -I/usr/lib/java/include -I/usr/lib/java/include/linux -c Sample1.c?
?編譯用到了jdk include中jni.h,include/linux中jni_md.h兩個(gè)頭文件
?/usr/lib/java/include ? ? ? ?是jin.h路徑
?/usr/lib/java/include、linux 是jni_md.h路徑
?此時(shí)生成Sampel.o文件
?運(yùn)行:
?gcc -shared Sample1.o -o libSample1.so
?生成libSample1.so


6.運(yùn)行java程序
libSample1.so文件拷貝到j(luò)ava的加載庫(kù)LD_LIBRARY_PATH指向的路徑中:
如果沒(méi)有足夠權(quán)限,可以這樣:
(1).在/home下建立一個(gè)用來(lái)存放.so庫(kù)文件的目錄,比如/home/xxx/lib
(2).把libSample1.so文件拷貝到該目錄下
(3).運(yùn)行:export LD_LIBRARY_PATH=/home/xxx/lib ?(只在當(dāng)前shall下有效...)
現(xiàn)在運(yùn)行java Sample1
一切正常后,可以看到運(yùn)行結(jié)果輸出:
intMethod: 25
booleanMethod: false
stringMethod: JAVA
intArrayMethod: 33
完成第一個(gè)JNI程序。

與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的linux下JNI的demo的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。