我正在编写一个需要使用JNI的程序,该程序包含以下步骤:
在c ++端创建一个对象
调用java方面做某事
取回在1
以下是传递给java的代码:
MyClass.java
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class MyClass */
#ifndef _Included_MyClass
#define _Included_MyClass
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: MyClass
* Method: init
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_MyClass_init
(JNIEnv *, jclass);
/*
* Class: MyClass
* Method: testCpp
* Signature: (J)V
*/
JNIEXPORT void JNICALL Java_MyClass_testCpp
(JNIEnv *, jclass, jlong);
#ifdef __cplusplus
}
#endif
class MyClass{
public:
int myInt;
};
#endif
MyClass.h
#include "MyClass.h"
JNIEXPORT void JNICALL Java_MyClass_init(JNIEnv *env, jclass clazz){
MyClass* myClass=new MyClass();
myClass->myInt=123;
long myClass_pointer=(long)myClass;
env->CallStaticVoidMethod(env->FindClass("MyClass"),env->GetStaticMethodID(env->FindClass("MyClass"),"testJava","(J)V"),myClass_pointer);
}
JNIEXPORT void JNICALL Java_MyClass_testCpp(JNIEnv * env,jclass clazz, jlong addr){
MyClass* myClass=reinterpret_cast<MyClass*>(addr);
printf("%d\n",myClass->myInt);
delete myClass;
}
MyClass.cpp
import java.nio.ByteBuffer;
public class MyClass{
static{
System.loadLibrary("MyClass");
}
public static native void init();
public static native void testCpp(ByteBuffer buf);
public static void testJava(ByteBuffer buf){
testCpp(buf);
}
public static void main(String[] args){
init();
}
}
但我也发现一些帖子可以先将对象指针转换为ByteBuffer,然后传递给java方:
MyClass.java
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class MyClass */
#ifndef _Included_MyClass
#define _Included_MyClass
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: MyClass
* Method: init
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_MyClass_init
(JNIEnv *, jclass);
/*
* Class: MyClass
* Method: testCpp
* Signature: (Ljava/nio/ByteBuffer;)V
*/
JNIEXPORT void JNICALL Java_MyClass_testCpp
(JNIEnv *, jclass, jobject);
#ifdef __cplusplus
}
#endif
class MyClass{
public:
int myInt;
};
#endif
MyClass.h
#include "MyClass.h"
JNIEXPORT void JNICALL Java_MyClass_init(JNIEnv *env, jclass clazz){
MyClass* myClass;
myClass->myInt=12345;
jobject myClass_pointer=env->NewDirectByteBuffer(myClass,sizeof(myClass));
env->CallStaticVoidMethod(env->FindClass("MyClass"),env->GetStaticMethodID(env->FindClass("MyClass"),"testJava","(Ljava/nio/ByteBuffer;)V"),myClass_pointer);
}
JNIEXPORT void JNICALL Java_MyClass_testCpp(JNIEnv * env,jclass clazz, jobject obj){
MyClass* myClass=(MyClass*)env->GetDirectBufferAddress(obj);
printf("%d\n",myClass->myInt);
delete myClass;
}
MyClass.cpp
{{1}}
我搜索了一些关于如何将c ++指针传递给Java端的帖子,似乎很多帖子都提出了关于long或ByteBuffer的解决方案,但很少有人比较long和ByteBuffer。此外,我发现一些问题所有者使用很长时间,有时使用ByteBuffer。
哪一个更好基于类型安全和跨平台?长? ByteBuffer的?或其他数据类型?或其他问题:何时使用long以及何时使用ByteBuffer?