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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java调用c视频接口_JAVA本地调用(JNI- java调用c)

發(fā)布時(shí)間:2024/9/27 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java调用c视频接口_JAVA本地调用(JNI- java调用c) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

記錄一下工作內(nèi)容,對術(shù)語了解不多,暫且這樣記著吧。

java調(diào)用c

一、寫jni的步驟如下:

1.創(chuàng)建java類,定義接口函數(shù),使用native修飾;

2.將java類編譯成class;

3.將class編譯成*.h頭文件;

4.在c/c++中實(shí)現(xiàn)java定義的接口函數(shù);

5.將該c/c++的實(shí)現(xiàn)導(dǎo)出動態(tài)鏈接庫;

6.將動態(tài)鏈接庫放到j(luò)ava的庫路徑;

7.使用。

二、應(yīng)該注意的一些問題:

1.注意該java類所在的包,包會影響導(dǎo)出的頭文件的名稱,還會影響到頭文件的生成;代碼中不要出現(xiàn)中文;

2.使用javac將類編譯成class文件,該文件會出現(xiàn)在java文件同一目錄下;

3.使用javah將class文件編譯成頭文件,這一步需要注意,如果該類在某個包下,需要在src路徑下進(jìn)行編譯,最后給出例子。

4.在c/c++中實(shí)現(xiàn)時(shí)注意java類型和c/c++類型間的轉(zhuǎn)換,我遇到的是jstring轉(zhuǎn)換成char*的問題。

對于如下函數(shù)

JNIEXPORT void JNICALL Java_com_bbwang_JniTest_printMsg

(JNIEnv *env, jobject o, jstring str)

{

}

如果是c實(shí)現(xiàn),調(diào)用GetStringUTFChars時(shí)應(yīng)該如下調(diào)用

const char *cstr = (*env)->GetStringUTFChars (env, str, NULL);

如果是c++實(shí)現(xiàn),調(diào)用GetStringUTFChars時(shí)需要如下操作

const char *cstr = env->GetStringUTFChars (str, NULL);

5.build時(shí)指定導(dǎo)出dll,需要將%JAVA_HOME%\include和%JAVA_HOME%\include\win32包含到additional include directories;

6.在java中使用時(shí)只需要java的接口定義文件和導(dǎo)出的dll,具體使用時(shí)需要LoadLibrary,dll放在java.library.path下;

三、具體實(shí)現(xiàn)的例子

1.先是java文件,我的文件在com.bbwang包下!:

package com.bbwang;

public class JniTest

{

public native void printMsg(String str);

public native long add(int left, int right);

public native long minus(int left, int right);

} // class JniTest end

2.編譯

找到src路徑下

javac com\bbwang\JniTest.java 編譯出class

javah com.bbwang.JniTest 編譯出頭文件,頭文件在src目錄下,名稱是com_bbwang_JniTest.h,頭文件內(nèi)容貼出來:

/* DO NOT EDIT THIS FILE - it is machine generated */

#include

/* Header for class com_bbwang_JniTest */

#ifndef _Included_com_bbwang_JniTest

#define _Included_com_bbwang_JniTest

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: com_bbwang_JniTest

* Method: printMsg

* Signature: (Ljava/lang/String;)V

*/

JNIEXPORT void JNICALL Java_com_bbwang_JniTest_printMsg

(JNIEnv *, jobject, jstring);

/*

* Class: com_bbwang_JniTest

* Method: add

* Signature: (II)J

*/

JNIEXPORT jlong JNICALL Java_com_bbwang_JniTest_add

(JNIEnv *, jobject, jint, jint);

/*

* Class: com_bbwang_JniTest

* Method: minues

* Signature: (II)J

*/

JNIEXPORT jlong JNICALL Java_com_bbwang_JniTest_minus

(JNIEnv *, jobject, jint, jint);

#ifdef __cplusplus

}

#endif

#endif

4.c實(shí)現(xiàn)

#include

#include

#include "com_bbwang_JniTest.h"

/*

* Class: com_bbwang_JniTest

* Method: printMsg

* Signature: (Ljava/lang/String;)V

*/

JNIEXPORT void JNICALL Java_com_bbwang_JniTest_printMsg

(JNIEnv *env, jobject o, jstring str)

{

const char *cstr = (*env)->GetStringUTFChars (env,?str, NULL);

fprintf (stdout, "from native method, msg = %s\n", cstr);

(*env)->ReleaseStringUTFChars (env,?str, cstr);

}

/*

* Class: com_bbwang_JniTest

* Method: add

* Signature: (II)J

*/

JNIEXPORT jlong JNICALL Java_com_bbwang_JniTest_add

(JNIEnv *env, jobject o, jint left, jint right)

{

return left + right;

}

/*

* Class: com_bbwang_JniTest

* Method: minues

* Signature: (II)J

*/

JNIEXPORT jlong JNICALL Java_com_bbwang_JniTest_minus

(JNIEnv *env, jobject o, jint left, jint right)

{

return left - right;

}

5.導(dǎo)出dll

6.可以使用了

我將dll放到了%JAVA_HOME%\bin目錄下,調(diào)用的文件內(nèi)容如下:

package com.bbwang;

public class ForTest

{

static

{

System.loadLibrary("JniTest");

}

public static void main(String[] args)

{

// 不知道java.library.path在哪就直接打出來撒

// System.out.println(System.getProperty("java.library.path"));

System.out.println("test start");

JniTest jt = new JniTest();

jt.printMsg("native method start");

long result = jt.add(1,2);

System.out.println(result);

result = jt.minus(6,2);

System.out.println(result);

jt.printMsg("native method end");

}

} // class ForTest end

7.恩,可以看到結(jié)果了:

test start

3

4

from native method, msg = native method start

from native method, msg = native method end

結(jié)果還是比較神奇的,消息竟然是最后打出來的

總結(jié)

以上是生活随笔為你收集整理的java调用c视频接口_JAVA本地调用(JNI- java调用c)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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