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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Ubuntu下,Java中利用JNI调用codeblocks c++生成的动态库的使用步骤

發(fā)布時(shí)間:2023/11/27 生活经验 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Ubuntu下,Java中利用JNI调用codeblocks c++生成的动态库的使用步骤 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1、? 打開新立得包管理器,搜索JDK,選擇openjdk-6-jdk安裝;

2、? 打開Ubuntu軟件中心,搜索Eclipse,選擇Eclipse集成開發(fā)環(huán)境,安裝;

3、? 打開EclipseFile-->New-->Java Project-->Project name:TestJavaJNI-->next-->Finish,選中TestJavaJNI,點(diǎn)擊右鍵-->new-->Class,Name:TestJNI-->Finish,編寫Java類;

public class TestJNI

{

public native int add(int a, int b);

public native String upperCase(String str);

static

{

?????????? System.loadLibrary("JniDll");

}

public static void main(String[] args)

{

?????????? TestJNI test = new TestJNI();

?

?????????? int a=10, b=20, result;?

?????????? result = test.add(a, b);

??????????

?????????? System.out.println("兩者的和為: " + result);

??????????

?????????? String str1, str2;

?????????

?????????? str1 = "abcDEFhijk";

??????????

?????????? str2 = test.upperCase(str1);

??????????

?????????? System.out.println(str2);

}

}

4、? 打開終端,進(jìn)入到TestJNI.java所在目錄下,執(zhí)行 javac TestJNI.java命令,編譯完成后生成TestJNI.class文件;

5、? 執(zhí)行Javah TestJNI命令,生成TestJNI.h頭文件;

6、? 打開Code::Blocksfile-->new-->Projects-->選中Shared library,-->Go-->next-->c++,Next-->Project title:JniDll-->next-->Finish,生成一個(gè)main.cpp文件;

#include "TestJNI.h"

#include <iostream>

#include <cstring>

#include <stdlib.h>

?

?

using namespace std;

?

extern "C"

{

??? char* jstringToNative(JNIEnv *env, jstring jstr)

??? {

??????? if (env->ExceptionCheck() == JNI_TRUE || jstr == NULL)

??????? {

??????????? env->ExceptionDescribe();

??????????? env->ExceptionClear();

??????????? printf("jstringToNative函數(shù)轉(zhuǎn)換時(shí),傳入的參數(shù)jstr為空");

?

??????????? return NULL;

??????? }

?

??????? jbyteArray bytes = 0;

??????? jthrowable exc;

??????? char *result = 0;

?

??????? if (env->EnsureLocalCapacity(2) < 0)

??????? {

??????????? return 0; /* out of memory error */

??????? }

?

??????? jclass jcls_str = env->FindClass("java/lang/String");

??????? jmethodID MID_String_getBytes = env->GetMethodID(jcls_str, "getBytes", "()[B");

?

??????? bytes = (jbyteArray)env->CallObjectMethod(jstr, MID_String_getBytes);

??????? exc = env->ExceptionOccurred();

?

??????? if (!exc)

??????? {

??????????? jint len = env->GetArrayLength( bytes);

??????????? result = (char *)malloc(len + 1);

?

????????? ??if (result == 0)

??????????? {

??????????????? //JNU_ThrowByName(env, "java/lang/OutOfMemoryError",??? 0);

??????????????? env->DeleteLocalRef(bytes);

?

??????????????? return 0;

??????????? }

?

??????????? env->GetByteArrayRegion(bytes, 0, len, (jbyte *)result);

??????????? result[len] = 0; /* NULL-terminate */

??????? }

??????? else

??????? {

??????????? env->DeleteLocalRef(exc);

??????? }

?

??????? env->DeleteLocalRef(bytes);

?

??????? return (char*)result;

??? }

?

??? jstring nativeTojstring( JNIEnv* env,const char* str )

??? {

??????? jclass strClass = env->FindClass( "Ljava/lang/String;");

??????? jmethodID ctorID = env->GetMethodID( strClass, "<init>",

???????????????????????????????????????????? "([BLjava/lang/String;)V");

?

??????? if (env->ExceptionCheck() == JNI_TRUE || str == NULL)

??????? {

??????????? env->ExceptionDescribe();

??????????? env->ExceptionClear();

??????????? printf("nativeTojstring函數(shù)轉(zhuǎn)換時(shí),str為空\n");

?

??????????? return NULL;

??????? }

?

??????? jbyteArray bytes = env->NewByteArray( strlen(str));

??????? //如果str為空則拋出異常給jvm

?

??????? env->SetByteArrayRegion( bytes, 0,? strlen(str), (jbyte*)str);

??????? //jstring encoding = env->NewStringUTF( "GBK");

??????? jstring encoding = env->NewStringUTF( "UTF8");

??????? jstring strRtn = (jstring)env->NewObject( strClass, ctorID, bytes,

???????????????????????? encoding);

??????? //釋放str內(nèi)存

??????? // free(str);

??????? return strRtn;

??? }

?

??? char* strupr(char *str)

??? {

??????? char *p = str;

?

??????? while (*p != '\0')

??????? {

??????????? if (*p >= 'a' && *p <= 'z')

??????????? {

??????????????? *p -= 0x20;

??????????? }

??????????? p++;

??????? }

??????? return str;

??? }

?

??? JNIEXPORT jint JNICALL Java_TestJNI_add(JNIEnv *env, jobject, jint a, jint b)

??? {

??????? int result = (int)(a + b);

?

??????? return (jint)result;

??? }

?

??? JNIEXPORT jstring JNICALL Java_TestJNI_upperCase(JNIEnv *env, jobject, jstring str)

??? {

??????? string strUpper;

?

??????? strUpper = (string)jstringToNative(env,str);

?

??????? strUpper = (string)strupr((char *)strUpper.c_str());

?

??????? jstring strResult = nativeTojstring(env, strUpper.c_str());

?

??????? return strResult;

??? }

}

7、? 將TestJNI.h頭文件復(fù)制到main.cpp目錄,并添加到工程中,分別在ReleaseDebug下,Projectàbuild optionsàSearch directoriesàCompileràAdd:

../../../../../usr/lib/jvm/java-6-openjdk/include/linux

../../../../../usr/lib/jvm/java-6-openjdk/include

???????? Project-->build options-->compiler settings-->Other options加入-fPIC;編譯生成libJniDll.so;

8、? 使用sudo cp命令將libJniDll.so(ReleaseDebug)拷貝到/usr/lib目錄下;

9、? 在Eclipce中運(yùn)行TestJNI.java或在終端運(yùn)行java TestJNI,運(yùn)行結(jié)果:

兩者的和為: 30

ABCDEFHIJK

?

參考文獻(xiàn):

1、? http://blog.sina.com.cn/s/blog_6a6b58ce0100oiip.html

2、? http://blog.csdn.net/lee353086/article/details/6160576

總結(jié)

以上是生活随笔為你收集整理的Ubuntu下,Java中利用JNI调用codeblocks c++生成的动态库的使用步骤的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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

歡迎分享!

轉(zhuǎn)載請(qǐng)說明來源于"生活随笔",并保留原作者的名字。

本文地址:Ubuntu下,Java中利用JNI调用codeblocks