java调用c视频接口_JAVA本地调用(JNI- java调用c)
記錄一下工作內容,對術語了解不多,暫且這樣記著吧。
java調用c
一、寫jni的步驟如下:
1.創建java類,定義接口函數,使用native修飾;
2.將java類編譯成class;
3.將class編譯成*.h頭文件;
4.在c/c++中實現java定義的接口函數;
5.將該c/c++的實現導出動態鏈接庫;
6.將動態鏈接庫放到java的庫路徑;
7.使用。
二、應該注意的一些問題:
1.注意該java類所在的包,包會影響導出的頭文件的名稱,還會影響到頭文件的生成;代碼中不要出現中文;
2.使用javac將類編譯成class文件,該文件會出現在java文件同一目錄下;
3.使用javah將class文件編譯成頭文件,這一步需要注意,如果該類在某個包下,需要在src路徑下進行編譯,最后給出例子。
4.在c/c++中實現時注意java類型和c/c++類型間的轉換,我遇到的是jstring轉換成char*的問題。
對于如下函數
JNIEXPORT void JNICALL Java_com_bbwang_JniTest_printMsg
(JNIEnv *env, jobject o, jstring str)
{
}
如果是c實現,調用GetStringUTFChars時應該如下調用
const char *cstr = (*env)->GetStringUTFChars (env, str, NULL);
如果是c++實現,調用GetStringUTFChars時需要如下操作
const char *cstr = env->GetStringUTFChars (str, NULL);
5.build時指定導出dll,需要將%JAVA_HOME%\include和%JAVA_HOME%\include\win32包含到additional include directories;
6.在java中使用時只需要java的接口定義文件和導出的dll,具體使用時需要LoadLibrary,dll放在java.library.path下;
三、具體實現的例子
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,頭文件內容貼出來:
/* 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實現
#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.導出dll
6.可以使用了
我將dll放到了%JAVA_HOME%\bin目錄下,調用的文件內容如下:
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.恩,可以看到結果了:
test start
3
4
from native method, msg = native method start
from native method, msg = native method end
結果還是比較神奇的,消息竟然是最后打出來的
總結
以上是生活随笔為你收集整理的java调用c视频接口_JAVA本地调用(JNI- java调用c)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: flask mysql orm,flas
- 下一篇: php中 和 的优先级,理解php中的运