java调用c视频接口_JAVA本地调用(JNI- java调用c)
記錄一下工作內(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: flask mysql orm,flas
- 下一篇: java中filehandler_jav