Jni中C++和Java的參數傳遞


Chap7:Jni中C++和Java的參數傳遞

 

如何使用JNI的一些基本方法和過程在網上多如牛毛,如果你對Jni不甚了解,不知道Jni是做什么的,如何建立一個基本的jni程序,或許可以參考下面下面這些文章:

 

<利用VC++6.0實現JNI的最簡單的例子>

<JNI入門教程之HelloWorld篇>

<SUN JNI Tutorial>

這 些資料的例子中,大多數只是輸入一些簡單的參數,獲取沒有參數。而在實際的使用過程中,往往需要對參數進行處理轉換。才可以被C/C++程序識別。比如我 們在C++中有一個結構(Struct)DiskInfo ,需要傳遞一個類似於DiskInfo *pDiskInfo的參數,類似於在C++這樣參數如何傳遞到Java中呢?下面我們就來討論C++到Java中方法的一些常見參數的轉換:

 

1.定義Native Java類:

如果你習慣了使用JNI,你就不會覺得它難了。既然本地方法是由其他語言實現的,它們在Java中沒有函數體。但是,所有本地代碼必須用本地關鍵詞native聲明,成為Java類的成員。假設我們在C++中有這么一個結構,它用來描述硬盤信息:

 

//硬盤信息

struct {

    char name[256];

    int serial;

}DiskInfo;

那么我們需要在Java中定義一個類來與之匹配,聲明可以寫成這樣:

class DiskInfo {

    //名字

    public String name;

    //序列號

    public int serial;

}

 

 

在這個類中,申明一些Native的本地方法,來測試方法參數的傳遞,分別定義了一些函數,用來傳遞結構或者結構數組,具體定義如下面代碼:

/**//****************** 定義本地方法 ********************/
    //輸入常用的數值類型(Boolean,Byte,Char,Short,Int,Float,Double)
    public native void displayParms(String showText, int i, boolean bl);

    //調用一個靜態方法
    public native int add(int a, int b);

    //輸入一個數組 
    public native void setArray(boolean[] blList);

    //返回一個字符串數組 
    public native String[] getStringArray();

    //返回一個結構
    public native DiskInfo getStruct();

//返回一個結構數組 
    public native DiskInfo[] getStructArray();

2.編譯生成C/C++頭文件

定義好了Java類之后,接下來就要寫本地代碼。本地方法符號提供一個滿足約定的頭文件,使用Java工具Javah可以很容易地創建它而不用手動去創建。你對Java的class文件使用javah命令,就會為你生成一個對應的C/C++頭文件。

1)、在控制台下進入工作路徑,本工程路徑為:E:\work\java\workspace\JavaJni。

2)、運行javah 命令:javah -classpath E:\work\java\workspace\JavaJni com.sundy.jnidemo ChangeMethodFromJni

本文生成的C/C++頭文件名為: com_sundy_jnidemo_ChangeMethodFromJni.h

 

3.在C/C++中實現本地方法

 

生 成C/C++頭文件之后,你就需要寫頭文件對應的本地方法。注意:所有的本地方法的第一個參數都是指向JNIEnv結構的。這個結構是用來調用JNI函數 的。第二個參數jclass的意義,要看方法是不是靜態的(static)或者實例(Instance)的。前者,jclass代表一個類對象的引用,而 后者是被調用的方法所屬對象的引用。

 

返回值和參數類型根據等價約定映射到本地C/C++類型,如表JNI類型映射所示。有些類型,在本地代碼中可直接使用,而其他類型只有通過JNI調用操作。

表A ※   JNI 類型映射

Java類型 本地類型 描述

boolean jboolean C/C++8位整型

byte jbyte C/C++帶符號的8位整型

char jchar C/C++無符號的16位整型

short jshort C/C++帶符號的16位整型

int jint C/C++帶符號的32位整型

long jlong C/C++帶符號的64位整型e

float jfloat C/C++32位浮點型

double jdouble C/C++64位浮點型

Object jobject 任何Java對象,或者沒有對應java類型的對象

Class jclass Class對象

String jstring 字符串對象

Object[] jobjectArray 任何對象的數組

boolean[] jbooleanArray 布爾型數組

byte[] jbyteArray 比特型數組

char[] jcharArray 字符型數組

short[] jshortArray 短整型數組

int[] jintArray 整型數組

long[] jlongArray 長整型數組

float[] jfloatArray 浮點型數組

double[] jdoubleArray 雙浮點型數組

 

 

3.1 使用數組:

JNI通過JNIEnv提供的操作Java數組的功能。它提供了兩個函數:一個是操作java的簡單型數組的,另一個是操作對象類型數組的。

因為速度的原因,簡單類型的數組作為指向本地類型的指針暴露給本地代碼。因此,它們能作為常規的數組存取。這個指針是指向實際的Java數組或者Java數組的拷貝的指針。另外,數組的布置保證匹配本地類型。

為了存取Java簡單類型的數組,你就要要使用GetXXXArrayElements函數(見表B),XXX代表了數組的類型。這個函數把Java數組看成參數,返回一個指向對應的本地類型的數組的指針。

表B

函數                  Java數組類型 本地類型

GetBooleanArrayElements jbooleanArray jboolean

GetByteArrayElements jbyteArray jbyte

GetCharArrayElements jcharArray jchar

GetShortArrayElements jshortArray jshort

GetIntArrayElements jintArray jint

GetLongArrayElements jlongArray jlong

GetFloatArrayElements jfloatArray jfloat

GetDoubleArrayElements jdoubleArray jdouble

 

 

JNI數組存取函數

當 你對數組的存取完成后,要確保調用相應的ReleaseXXXArrayElements函數,參數是對應Java數組和 GetXXXArrayElements返回的指針。如果必要的話,這個釋放函數會復制你做的任何變化(這樣它們就反射到java數組),然后釋放所有相 關的資源。

為了使用java對象的數組,你必須使用GetObjectArrayElement函數和SetObjectArrayElement函數,分別去get,set數組的元素。GetArrayLength函數會返回數組的長度。

 

3.2 使用對象

JNI 提供的另外一個功能是在本地代碼中使用Java對象。通過使用合適的JNI函數,你可以創建Java對象,get、set 靜態(static)和實例(instance)的域,調用靜態(static)和實例(instance)函數。JNI通過ID識別域和方法,一個域或 方法的ID是任何處理域和方法的函數的必須參數。

 

表C列出了用以得到靜態(static)和實例(instance)的域與方法的JNI函數。每個函數接受(作為參數)域或方法的類,它們的名稱,符號和它們對應返回的jfieldID或jmethodID。

 

表C

函數 描述

GetFieldID 得到一個實例的域的ID

GetStaticFieldID 得到一個靜態的域的ID

GetMethodID 得到一個實例的方法的ID

GetStaticMethodID 得到一個靜態方法的ID

※域和方法的函數

如果你有了一個類的實例,它就可以通過方法GetObjectClass得到,或者如果你沒有這個類的實例,可以通過FindClass得到。符號是從域的類型或者方法的參數,返回值得到字符串,如表D所示。

 

表D

Java類型   符號

boolean Z

byte B

char C

short S

int I

long L

float F

double D

void V

objects對象 Lfully-qualified-class-name;L類名

Arrays數組 [array-type [數組類型

methods方法 (argument-types)return-type(參數類型)返回類型

 

※確定域和方法的符號

下面我們來看看,如果通過使用數組和對象,從C++中的獲取到Java中的DiskInfo 類對象,並返回一個DiskInfo數組:

//返回一個結構數組,返回一個硬盤信息的結構數組

JNIEXPORT jobjectArray JNICALL

Java_com_sundy_jnidemo_ChangeMethodFromJni_getStructArray

(JNIEnv *env, jobject _obj)

{

    //申明一個object數組

    jobjectArray args = 0;

    //數組大小

    jsize        len = 5;

    //獲取object所屬類,一般為java/lang/Object就可以了

    jclass objClass = (env)->FindClass("java/lang/Object");

    //新建object數組

    args = (env)->NewObjectArray(len, objClass, 0);

    /**//* 下面為獲取到Java中對應的實例類中的變量*/

    //獲取Java中的實例類

    jclass objectClass = (env)->FindClass("com/sundy/jnidemo/DiskInfo");

    //獲取類中每一個變量的定義

    //名字

    jfieldID str = (env)->GetFieldID(objectClass,"name","Ljava/lang/String;");

    //序列號

    jfieldID ival = (env)->GetFieldID(objectClass,"serial","I");

    //給每一個實例的變量付值,並且將實例作為一個object,添加到objcet數組中

    for(int i=0; i < len; i++ )

    {

        //給每一個實例的變量付值

        jstring jstr = WindowsTojstring(env,"我的磁盤名字是 D:");

        //(env)->SetObjectField(_obj,str,(env)->NewStringUTF("my name is D:"));

        (env)->SetObjectField(_obj,str,jstr);

        (env)->SetShortField(_obj,ival,10);

        //添加到objcet數組中

        (env)->SetObjectArrayElement(args, i, _obj);

    }

    //返回object數組

    return args;

}

全部的C/C++方法實現代碼如下:

/**//*

*

* 一縷陽光(sundy)版權所有,保留所有權利。

*/

/**//**

*

* TODO Jni 中一個從Java到C/C++參數傳遞測試類

*

* @author 劉正偉(sundy)

* @see http://www.cnweblog.com/sundy

* @see mailto:sundy26@126.com

* @version 1.0

* @since 2005-4-30

*

* 修改記錄:

*

* 日期              修改人                 描述

* ----------------------------------------------------------------------------------------------

*

*

*

*/

// JniManage.cpp : 定義 DLL 應用程序的入口點。

//

package com.sundy.jnidemo;

#include "stdafx.h"

#include <stdio.h>

#include <math.h>

#include "jni.h"

#include "jni_md.h"

#include "./head/Base.h"

#include "head/wmi.h"

#include "head/com_sundy_jnidemo_ChangeMethodFromJni.h" //通過javah –jni javactransfer 生成

#include <stdio.h>

#include "stdlib.h"

#include "string.h"

#pragma comment (lib,"BaseInfo.lib")

#pragma comment (lib,"jvm.lib")

//硬盤信息

struct {

    char name[256];

    int serial;

}DiskInfo;

 

/**//*BOOL APIENTRY DllMain( HANDLE hModule,

                       DWORD ul_reason_for_call,

                       LPVOID lpReserved

                     )

{

    LPTSTR strName = new CHAR[256] ;

    (*GetHostName)(strName);

    printf("%s\n",strName);

    delete [] strName;

    return TRUE;

}*/

//將jstring類型轉換成windows類型

char* jstringToWindows( JNIEnv *env, jstring jstr );

//將windows類型轉換成jstring類型

jstring WindowsTojstring( JNIEnv* env, char* str );

//主函數

BOOL WINAPI DllMain(HANDLE hHandle, DWORD dwReason, LPVOID lpReserved)

{

    return TRUE;

}

//輸入常用的數值類型 Boolean,Byte,Char,Short,Int,Float,Double

JNIEXPORT void JNICALL Java_com_sundy_jnidemo_ChangeMethodFromJni_displayParms

(JNIEnv *env, jobject obj, jstring s, jint i, jboolean b)

{

    const char* szStr = (env)->GetStringUTFChars(s, 0 );

    printf( "String = [%s]\n", szStr );

    printf( "int = %d\n", i );

    printf( "boolean = %s\n", (b==JNI_TRUE ? "true" : "false") );

    (env)->ReleaseStringUTFChars(s, szStr );

}

//調用一個靜態方法,只有一個簡單類型輸出

JNIEXPORT jint JNICALL Java_com_sundy_jnidemo_ChangeMethodFromJni_add

(JNIEnv *env, jobject, jint a, jint b)

{

    int rtn = (int)(a + b);

    return (jint)rtn;

}

/**/////輸入一個數組,這里輸入的是一個Boolean類型的數組

JNIEXPORT void JNICALL Java_com_sundy_jnidemo_ChangeMethodFromJni_setArray

(JNIEnv *env, jobject, jbooleanArray ba)

{

    jboolean* pba = (env)->GetBooleanArrayElements(ba, 0 );

    jsize len = (env)->GetArrayLength(ba);

    int i=0;

    // change even array elements

    for( i=0; i < len; i+=2 )

    {

        pba[i] = JNI_FALSE;

        printf( "boolean = %s\n", (pba[i]==JNI_TRUE ? "true" : "false") );

    }

    (env)->ReleaseBooleanArrayElements(ba, pba, 0 );

}

/**/////返回一個字符串數組

JNIEXPORT jobjectArray JNICALL Java_com_sundy_jnidemo_ChangeMethodFromJni_getStringArray

(JNIEnv *env, jobject)

{

    jstring      str;

    jobjectArray args = 0;

    jsize        len = 5;

    char*        sa[] = { "Hello,", "world!", "JNI", "is", "fun" };

    int          i=0;

    args = (env)->NewObjectArray(len,(env)->FindClass("java/lang/String"),0);

    for( i=0; i < len; i++ )

    {

        str = (env)->NewStringUTF(sa[i] );

        (env)->SetObjectArrayElement(args, i, str);

    }

    return args;

}

//返回一個結構,這里返回一個硬盤信息的簡單結構類型

JNIEXPORT jobject JNICALL Java_com_sundy_jnidemo_ChangeMethodFromJni_getStruct

(JNIEnv *env, jobject obj)

{

    /**//* 下面為獲取到Java中對應的實例類中的變量*/

    //獲取Java中的實例類

    jclass objectClass = (env)->FindClass("com/sundy/jnidemo/DiskInfo");

    //獲取類中每一個變量的定義

    //名字

    jfieldID str = (env)->GetFieldID(objectClass,"name","Ljava/lang/String;");

    //序列號

    jfieldID ival = (env)->GetFieldID(objectClass,"serial","I");

 

    //給每一個實例的變量付值

    (env)->SetObjectField(obj,str,(env)->NewStringUTF("my name is D:"));

    (env)->SetShortField(obj,ival,10);

 

    return obj;

}

//返回一個結構數組,返回一個硬盤信息的結構數組

JNIEXPORT jobjectArray JNICALL Java_com_sundy_jnidemo_ChangeMethodFromJni_getStructArray

(JNIEnv *env, jobject _obj)

{

    //申明一個object數組

    jobjectArray args = 0;

 

    //數組大小

    jsize        len = 5;

    //獲取object所屬類,一般為ava/lang/Object就可以了

    jclass objClass = (env)->FindClass("java/lang/Object");

    //新建object數組

    args = (env)->NewObjectArray(len, objClass, 0);

    /**//* 下面為獲取到Java中對應的實例類中的變量*/

    //獲取Java中的實例類

    jclass objectClass = (env)->FindClass("com/sundy/jnidemo/DiskInfo");

 

    //獲取類中每一個變量的定義

    //名字

    jfieldID str = (env)->GetFieldID(objectClass,"name","Ljava/lang/String;");

    //序列號

    jfieldID ival = (env)->GetFieldID(objectClass,"serial","I");

    //給每一個實例的變量付值,並且將實例作為一個object,添加到objcet數組中

    for(int i=0; i < len; i++ )

    {

        //給每一個實例的變量付值

        jstring jstr = WindowsTojstring(env,"我的磁盤名字是 D:");

        //(env)->SetObjectField(_obj,str,(env)->NewStringUTF("my name is D:"));

        (env)->SetObjectField(_obj,str,jstr);

        (env)->SetShortField(_obj,ival,10);

        //添加到objcet數組中

        (env)->SetObjectArrayElement(args, i, _obj);

    }

    //返回object數組

    return args;

}

//將jstring類型轉換成windows類型

char* jstringToWindows( JNIEnv *env, jstring jstr )

{

    int length = (env)->GetStringLength(jstr );

    const jchar* jcstr = (env)->GetStringChars(jstr, 0 );

    char* rtn = (char*)malloc( length*2+1 );

    int size = 0;

    size = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)jcstr, length, rtn,(length*2+1), NULL, NULL );

    if( size <= 0 )

        return NULL;

    (env)->ReleaseStringChars(jstr, jcstr );

    rtn[size] = 0;

    return rtn;

}

//將windows類型轉換成jstring類型

jstring WindowsTojstring( JNIEnv* env, char* str )

{

    jstring rtn = 0;

    int slen = strlen(str);

    unsigned short * buffer = 0;

    if( slen == 0 )

        rtn = (env)->NewStringUTF(str );

    else

    {

        int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0 );

        buffer = (unsigned short *)malloc( length*2 + 1 );

        if( MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer, length ) >0 )

            rtn = (env)->NewString( (jchar*)buffer, length );

    }

    if( buffer )

        free( buffer );

    return rtn;

}

Java 測試native代碼

這沒有什么多說的,看代碼吧

//主測試程序

    public static void main(String[] args) {

        ChangeMethodFromJni changeJni = new ChangeMethodFromJni();

        //輸入常用的數值類型(string int boolean)

        System.out

                .println("------------------輸入常用的數值類型(string int boolean)-----------");

        changeJni.displayParms("Hello World!", 100, true);

        //調用一個靜態方法

        System.out.println("------------------調用一個靜態方法-----------");

        int ret = changeJni.add(12, 20);

        System.out.println("The result is: " + String.valueOf(ret));

        //輸入一個數組

        System.out.println("------------------輸入一個數組-----------");

        boolean[] blList = new boolean[] { true, false, true };

        changeJni.setArray(blList);

        //返回一個字符串數組

        System.out.println("------------------返回一個字符串數組-----------");

        String[] strList = changeJni.getStringArray();

        for (int i = 0; i < strList.length; i++) {

            System.out.print(strList[i]);

        }

        System.out.println();

        System.out.println("------------------返回一個結構-----------");

        //返回一個結構

        DiskInfo disk = changeJni.getStruct();

        System.out.println("name:" + disk.name);

        System.out.println("Serial:" + disk.serial);

        //返回一個結構數組

        System.out.println("------------------返回一個結構數組 -----------");

        DiskInfo[] diskList = changeJni.getStructArray();

        for (int i = 0; i < diskList.length; i++) {

            System.out.println("name:" + diskList[i].name);

            System.out.println("Serial:" + diskList[i].serial);

        }

    }

注:本程序在VS2003,eclipse (jse5.0) winxp sp2編譯通過

 

posted on 2005-05-02 20:22 sundy 閱讀(4406) 評論(21) 編輯 收藏 所屬分類: Java

 

評論

# re: Jni中C++和Java的參數傳遞 2005-05-22 14:35 張磊

請問如果想返回byte[]類型該怎么做 回復 更多評論  

# re: Jni中C++和Java的參數傳遞 2005-05-23 08:37 sundy

因為:

byte[] jbyteArray 比特型數組

所以你將byte[] 作為一個jbyteArray數組傳遞就可以了

回復 更多評論  

# re: Jni中C++和Java的參數傳遞 2005-09-21 14:46 小影

請問如果我想把在C++里面計算好的一個二維數組傳回給java程序接受,該怎么寫代碼呢?我找了很多這方面的書和資料,都沒有關於傳遞二維數組的介紹,請您給予指導,多謝啦^_^ 回復 更多評論  

# re: Jni中C++和Java的參數傳遞 2005-09-21 17:47 sundy

我沒有直接傳遞過二維數組

但我想你可以把試一試二維數組轉換成為一個Hashmap的數組傳出來。

請參考"如何在Jni中傳遞出Hashmap的數組?"的一些代碼

回復 更多評論  

# re: Jni中C++和Java的參數傳遞 2005-12-26 16:32 wangjian

返回一個結構數組時,為什么每個對象的數據都是一樣的?即5個Diskinfo的成員值都相同,能不能不相同? 回復 更多評論  

# re: Jni中C++和Java的參數傳遞 2005-12-26 16:55 wangjian

我把5個DiskInfo對象的成員serial分別設置為1、2、3、4、5,可是傳遞到java后5個對象的serial成員值都是5,為什么這樣阿?盼回復,多謝! 回復 更多評論  

# re: Jni中C++和Java的參數傳遞 2005-12-27 21:51 sundy

//給每一個實例的變量付值,並且將實例作為一個object,添加到objcet數組中

for(int i=0; i < len; i++ )

{

......

//添加到objcet數組中

(env)->SetObjectArrayElement(args, i, _obj);

}

你看看設置的_Obj是不是都是同一個??

回復 更多評論  

# re: Jni中C++和Java的參數傳遞 2005-12-28 13:32 wangjian

如下所示,我就是把你程序中(env)->SetShortField(_obj,ival,10)的參數10換成i,結果每個對象都是對象的serial成員值都是4,請問怎樣實現多個不同對象的傳遞?

for(int i=0; i < len; i++ )

{

jstring jstr = WindowsTojstring(env,"我的磁盤名字是D:");

(env)->SetObjectField(_obj,str,jstr);

(env)->SetShortField(_obj,ival,i);

(env)->SetObjectArrayElement(args, i, _obj);

}

回復 更多評論  

# re: Jni中C++和Java的參數傳遞 2005-12-28 15:15 sundy

應該沒有問題的呀,

SetObjectArrayElement的時候,_obj是不同的嗎?

要不你將for循環改為:

jstring jstr = WindowsTojstring(env,"我的磁盤名字是C:");

(env)->SetObjectField(_obj,str,jstr);

(env)->SetShortField(_obj,ival,0);

(env)->SetObjectArrayElement(args, 0, _obj);

jstring jstr = WindowsTojstring(env,"我的磁盤名字是D:");

(env)->SetObjectField(_obj,str,jstr);

(env)->SetShortField(_obj,ival,1);

(env)->SetObjectArrayElement(args, 1, _obj);

看看對嗎?   回復 更多評論  

# re: Jni中C++和Java的參數傳遞 2005-12-29 20:42 wangjian

這樣作不對,不過我找到正確的方法了,要用構造函數生成新的對象。 回復 更多評論  

# re: Jni中C++和Java的參數傳遞 2006-01-17 11:07 luli

SQLRETURN SQLAllocHandle( SQLSMALLINT HandleType,

SQLHANDLE InputHandle,

SQLHANDLE * OutputHandlePtr

)

這是odbc api里的一個函數 SQLHANDLE 是一個結構

c#里的引用方式如下

[DllImport("ODBC32.dll")]

private static extern short SQLAllocHandle(short hType, IntPtr inputHandle, out IntPtr outputHandle);

但我不清楚 SQLHANDLE 結構具體怎么構造的 因此我無法用java類來模擬

我是菜鳥 望解答 謝過了   回復 更多評論  

# re: Jni中C++和Java的參數傳遞 2006-01-17 14:25 luli

忘了補充 SQLHANDLE InputHandle與SQLHANDLE * OutputHandlePtr

一個是結構 一個是結構指針 那我是否該如下模擬

class SQLHANDLE

{

}

public class test

{

SQLHANDLE a=new SQLHANDLE ();

public static void main(String args[]) {

int i=SQLAllocHandle( SQLSMALLINT HandleType, new SQLHANDLE(),a)

}

}

回復 更多評論  

# re: Jni中C++和Java的參數傳遞 2006-03-21 17:31 Hefe

WideCharToMultiByte();

MultiByteToWideChar();

請問這兩個函數實現什么功能,請作者給出代碼,多謝!

 

回復 更多評論  

# re: Jni中C++和Java的參數傳遞 2006-03-22 08:47 sundy

@Hefe look here: http://www.google.com/search?hl=zh-CN&lr=lang_zh-CN&q=WideCharToMultiByte

回復 更多評論  

# re: Jni中C++和Java的參數傳遞 2006-03-28 17:40 dijk

要在c函數中調用java類的類成員的方法,比如調用JEditorPane類型成員的setText方法,該怎么辦? 回復 更多評論  

# re: Jni中C++和Java的參數傳遞 2006-04-16 21:33 陳世雄

java中函數的處理中,對於對象類型(非基本類型int,long...)的輸入參數,函數中是可以修改輸入參數的內容,函數執行完畢,修改仍然是有效的。

jni中 是否也是這樣呢?

回復 更多評論   

# re: Jni中C++和Java的參數傳遞 2006-04-18 17:50 王文波

你好:

向你請教一個問題:我想用jini來調用dll。我在jbuilder中新建的簡單的project調用jini運行正常。但是,我現在要對一個工程軟件進行二次開發,該軟件的

開發也使用jbuilder生成一個project,然后放在指定的路徑下就可以了,該軟件在運行的時候會自動讀取該project。我在這個軟件二次開發的project中使用

jini,則總是報錯:unsatisfiedlinkError get()。其中get()方法名。請問該怎么解決這個問題?

我的郵箱:zwj23232@tom.com 回復 更多評論  

# re: Jni中C++和Java的參數傳遞 2006-05-29 21:25 single

# re: Jni中C++和Java的參數傳遞 2005-12-29 20:42 wangjian

這樣作不對,不過我找到正確的方法了,要用構造函數生成新的對象。 回復

---------------------------------------------------

能說說方法嗎? 回復 更多評論  

# re: Jni中C++和Java的參數傳遞 2006-08-29 11:34 yangyongfa

我 正在做JNI,是在C++中調用JAVA類的方法,請問,我在JAVA類的方法中參數使 用的是byte[],而我在C++中是把一個文件讀成unsigned char*,請問怎么可以正確調用JAVA中的方法? 類中方法原型:public boolean AddHoyuBox2DB(String BoxName, byte[] BoxFile,byte[] WDHPic,int BoxFileBinLen, int WDHPicBinLen, String ParameterText, byte[] XXPic,int PicBinLen, byte[] SeriousPics,int SeriousPicsBinLen,String FileLenStr) ?

回復 更多評論  

# re: Jni中C++和Java的參數傳遞 2007-10-25 15:27 vampire

c的結構提里寫有一個**p,指針的指針,在java中該如何封裝??? 回復 更多評論  

# re: Jni中C++和Java的參數傳遞 2007-12-11 13:13 Focus

@single

for(int i=0; i < len; i++ )

{

jobject objTemp = (env)->AllocObject(objectClass); //釋放問題??這個是否需要釋放不是很懂

//objectClass是函數上面給的 那個

jstring jstr = WindowsTojstring(env,"我的磁盤名字是D:");

(env)->SetObjectField(objTemp,str,jstr);

(env)->SetShortField(objTemp,ival,i);

(env)->SetObjectArrayElement(args, i, objTemp);

}

這個 可以實現 數組 元素相同的問題


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM