将本机指针存储在Java对象中的"正确"方法是什么?
我可以将指针视为Java int,如果我碰巧知道本机指针的大小是<= 32位,或者long如果我碰巧知道本机指针的大小是<= 64位的话.但有没有更好或更清洁的方法来做到这一点?
编辑:从JNI函数返回一个指针原生到底是什么我也不想做.我宁愿返回一个代表本机资源的Java对象.但是,我返回的Java对象必须有一个包含指针的字段,这使我回到原始问题.
或者,是否有一些更好的方法让JNI函数返回对本机资源的引用?
我正在开发eclipse中的android应用程序,现在我遇到了问题,我需要你的帮助.所以我必须从JAVA应用程序调用C编写的函数.但在我编写代码的过程中,我有一些问题,你可以在下面看到.我在等你的答案和想法......
typdef struct blobData_s {
unsigned long length;
unsigned char data[1];
} blobData_t;
unsigned int CheckEnrollmentExist ( unsigned long hdevice, blobData_t* pInputInfo ) {
// Function code goes here
..........................
return some_value;
}
Run Code Online (Sandbox Code Playgroud)
在JAVA代码而不是unsigned long我使用int所以我可以写.
class jblobData_c {
public int langth;
*Question 1.*
}
public class ApplicationMainClass extends Activity {
// Some code goes here
......................
public native int JCheckEnrollmentExist( int jhdevive, *Question 2.* );
}
Run Code Online (Sandbox Code Playgroud)
问题1.
unsigned …我已经通过JNI通过遵循@tulskiy的建议在Java中存储c指针在这篇文章中通过JNI传递C和Java之间的指针
诀窍是将指针转换为jlong.所以从c我有return (jlong) ptr;
我正在返回一个jlong(总是64位),因为我希望我的代码可以在64位和32位系统上运行.64位计算机上64位指针的内存大小为64,因此在32位计算机上,内存中指针的大小为32位.
问题是在32位机器上我得到一个编译器警告说"从不同大小的指针转换为整数".如果我有警告就会消失
return (jlong) (int32_t) ptr;但是这个代码不适合64位机器.
我希望我的代码在没有警告的情况下进行编译,这样如果有合法警告,我会看到它.有人有主意吗?
谢谢,本
我正在尝试将结构作为指针从JNI传递到Java,以便稍后可以将其从Java传递回JNI.我已经读过这个帖子:通过JNI在C和Java之间传递指针,但是我没有成功.
我有一个非常复杂的结构: struct myStruct_s myStruct;
从Java,我称之为JNI函数初始化结构,并返回一个长(指针结构):
JNIEXPORT jlong JNICALL Java_example_ExampleJNI_getStruct(JNIEnv *jenv, jclass jcls) {
struct myStruct_s mystruct;
long *lp = (long*)&myStruct;
return lp;
}
Run Code Online (Sandbox Code Playgroud)
然后我用一个长的参数调用一个Java方法.在JNI中,我希望能够使用之前创建的strcuture.我喜欢这个:
JNIEEXPORT jint JNICALL Java_example_ExampleJNI_methode1(JNIEnv *jenv, jclass jcls, jlong jarg) {
struct myStruct_s *arg = (struct myStruct_s *)&jarg;
...
}
Run Code Online (Sandbox Code Playgroud)
好吧它不起作用.我想我对结构中的长镜头是错误的.我该怎么办?谢谢.
编辑:感谢您的提示,这里是工作函数
JNIEXPORT jint JNICALL Java_example_ExampleJNI_methode1(JNIEnv *jenv, jclass jcls, jlong jarg) {
struct myStruct_s *arg;
arg = (struct myStruct_s *)jarg;
...
}
JNIEXPORT jlong JNICALL Java_example_ExampleJNI_getStruct(JNIEnv *jenv, jclass jcls) {
struct myStruct_s *myStruct; …Run Code Online (Sandbox Code Playgroud) 我试图了解如何GetDirectBufferAddress从JNI层使用.要理解我构建了一个非常简单的例子:
public class my_image_info {
static {
System.loadLibrary("my_jni");
}
private java.nio.ByteBuffer image_info_bb;
native static void initc( java.nio.ByteBuffer bb );
my_image_info()
{
image_info_bb = java.nio.ByteBuffer.allocateDirect( 5 * 4 );
initc( image_info_bb );
}
public java.nio.ByteBuffer getBB() {
return image_info_bb;
}
static public void main(String argv[]) {
my_image_info fii = new my_image_info();
java.nio.ByteBuffer bb = fii.getBB();
System.out.println("1: " + bb.getInt(0));
System.out.println("2: " + bb.getInt(4));
System.out.println("3: " + bb.getInt(8));
System.out.println("4: " + bb.getInt(12));
System.out.println("5: " + bb.getInt(16));
}
Run Code Online (Sandbox Code Playgroud)
然后从本机JNI层:
JNIEXPORT void …Run Code Online (Sandbox Code Playgroud) 我有一个本机方法.int sum(int *,int *)如何从java端传递此方法的参数.
编辑:我成功运行的示例方法是double gsl_stats_mean(doubleArray,int,int); 这个方法在GSL中可用,因为我创建了共享对象,并且从java方面我已经发送了所需的参数,并且我得到了double作为返回值.