java - Android、JNI在C++中调用java构造函数

标签 java android c++ java-native-interface method-call

我有以下 java 类:

 public class SHPObject {
    public int nSHPType;
    int nShapeId;
    public int nParts;
    int[] panPartStart;
    int panPartType;
    int nVertices;
    double[] padfX;
    double[] padfY;

    public SHPObject(int nSHPType, int nParts, int[] panPartStart, double[] padfX, double[] padfY ){
        this.nSHPType = nSHPType;
        this.nParts = nParts;
        this.panPartStart = panPartStart;
        this.padfX = padfX;
        this.padfY = padfY;
    }

 }

我正在尝试用 C++ 创建此类的对象。这是我的代码:

    jclass shpObjectClass = env->FindClass("com/example/kaczor/tmc_shpreader/Shape/Shapes/SHPObject");
    jmethodID shpObjectConstructor = env->GetMethodID(shpObjectClass, "<init>", "(II[I[D[D)V");
    jobject recognition_result;
    SHPObject* a = new SHPObject[nEntities];
    for(i = 0; i < nEntities; i++){
        a[i] = *SHPReadObject(handle,i);
        recognition_result = env->NewObject(
                shpObjectClass, shpObjectConstructor, a[i].nSHPType, a[i].nParts, *a[i].panPartStart, *a[i].padfX, *a[i].padfY);
    ...
    }

可悲的是,当执行这段代码时,我的应用程序关闭了。尽管当我将 Java 中的构造函数和 C++ 中的方法签名更改为:

public SHPObject(int nSHPType, int nParts, int[] panPartStart)

methodID shpObjectConstructor = env->GetMethodID(shpObjectClass, "<init>", "(II[I)V");

一切正常。所以在传递 double[] 变量时存在一些问题。我不知道出了什么问题。这是执行此代码后堆栈跟踪的一部分(不太确定我应该给出它的哪一部分,我没有注意到任何与错误相关的内容):

06-19 17:23:08.876 728-728/com.example.kaczor.tmc_shpreader W/dalvikvm: 
Invalid indirect reference 0xbcad9adc in decodeIndirectRef
06-19 17:23:08.876 728-728/com.example.kaczor.tmc_shpreader E/dalvikvm: VM 
aborting
06-19 17:23:08.906 728-728/com.example.kaczor.tmc_shpreader A/libc: Fatal 
signal 11 (SIGSEGV) at 0xdeadd00d (code=1), thread 728 (r.tmc_shpreader)
[...]

编辑: C++ SHPObject 定义可在以下位置找到:http://shapelib.maptools.org/shp_api.html

最佳答案

所以我已经将 double[] 转换为 jdoubleArray,不知道为什么我不必转换 int[]。虽然我发现Java中int[]的值都是0,所以我还是要转换一下。

    jclass shpObjectClass = env->FindClass("com/example/kaczor/tmc_shpreader/Shape/Shapes/SHPObject");
    jmethodID shpObjectConstructor = env->GetMethodID(shpObjectClass, "<init>", "(IIIIIII[I[D[D)V");
    SHPObject* a = new SHPObject[nEntities];
    jobject recognition_result;
    jobjectArray shapesToReturn = env->NewObjectArray(nEntities,shpObjectClass,env->NewObject(shpObjectClass,defaultShpObjectConstructor));

    for(i = 0; i < nEntities; i++){
        a[i] = *SHPReadObject(handle,i);

        jdoubleArray padfXARRAY = env->NewDoubleArray(a[i].nVertices);
        env->SetDoubleArrayRegion(padfXARRAY, 0, a[i].nVertices, (jdouble *)a[i].padfX );
        jdoubleArray padfYARRAY = env->NewDoubleArray(a[i].nVertices);
        env->SetDoubleArrayRegion(padfYARRAY, 0, a[i].nVertices, (jdouble *)a[i].padfY );
jdoubleArray panPartStart = env->NewDoubleArray(a[i].nParts);
        env->SetDoubleArrayRegion(panPartStart, 0, a[i].nParts, (jdouble *)a[i].panPartStart );

        int shapeId = a[i].nShapeId;
        int shpType = a[i].nSHPType;
        int nParts = a[i].nParts;
        int dfXMin = a[i].dfXMin;
        int dfXmax = a[i].dfXMax;
        int dfYMax = a[i].dfYMax;
        int dfYMin = a[i].dfYMin;

        recognition_result = env->NewObject(
                        shpObjectClass, shpObjectConstructor, shapeId,shpType,nParts,dfXMin,dfXmax,dfYMin,dfYMax,panPartStart, padfXARRAY, padfYARRAY);
        env->DeleteLocalRef(padfXARRAY);
        env->DeleteLocalRef(padfYARRAY);
        env->SetObjectArrayElement(shapesToReturn,i,recognition_result);
    }

关于java - Android、JNI在C++中调用java构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44636567/

相关文章:

java - 无法运行查询java mysql数据库

java - 如何获取四方 field 列表 - Android

android - 有Android SDK到带有蜂窝的平板电脑吗?

android - 嵌入式 Base64 图像不会在 Dolphin 或 Android Stock 浏览器中显示

java - 从字符串中提取日期

java - android如何将json对象转换为json数组

c++ - 如何修复由生成随机枚举值引起的堆栈损坏?

c# - 无法从 C# 调试非托管 Dll

C++ - 为默认类型重载赋值运算符

java - 如何根据 data-stat 从表中获取 1 个元素