相关疑难解决方法(0)

将本机指针存储在Java对象中的"正确"方法是什么?

将本机指针存储在Java对象中的"正确"方法是什么?

我可以将指针视为Java int,如果我碰巧知道本机指针的大小是<= 32位,或者long如果我碰巧知道本机指针的大小是<= 64位的话.但有没有更好或更清洁的方法来做到这一点?

编辑:从JNI函数返回一个指针原生到底是什么我也不想做.我宁愿返回一个代表本机资源的Java对象.但是,我返回的Java对象必须有一个包含指针的字段,这使我回到原始问题.

或者,是否有一些更好的方法让JNI函数返回对本机资源的引用?

java java-native-interface

24
推荐指数
2
解决办法
8417
查看次数

JNI:从C代码到Java和JNI

背景

我正在开发eclipse中的android应用程序,现在我遇到了问题,我需要你的帮助.所以我必须从JAVA应用程序调用C编写的函数.但在我编写代码的过程中,我有一些问题,你可以在下面看到.我在等你的答案和想法......

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代码:

在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 …

c java eclipse java-native-interface android

11
推荐指数
1
解决办法
2760
查看次数

通过JNI传递C和Java之间的指针

我已经通过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位机器.

我希望我的代码在没有警告的情况下进行编译,这样如果有合法警告,我会看到它.有人有主意吗?

谢谢,本

c java java-native-interface pointers casting

10
推荐指数
1
解决办法
5871
查看次数

使用long将指针从JNI传递到Java

我正在尝试将结构作为指针从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)

c java java-native-interface struct pointers

7
推荐指数
1
解决办法
9550
查看次数

使用JNI中的GetDirectBufferAddress

我试图了解如何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)

c java java-native-interface

4
推荐指数
1
解决办法
6975
查看次数

如何在JNI中将指针从java传递给C?

我有一个本机方法.int sum(int *,int *)如何从java端传递此方法的参数.

编辑:我成功运行的示例方法是double gsl_stats_mean(doubleArray,int,int); 这个方法在GSL中可用,因为我创建了共享对象,并且从java方面我已经发送了所需的参数,并且我得到了double作为返回值.

java java-native-interface pointers

3
推荐指数
1
解决办法
6860
查看次数

标签 统计

java ×6

java-native-interface ×6

c ×4

pointers ×3

android ×1

casting ×1

eclipse ×1

struct ×1