1

正如标题所示,我需要一些帮助为此方法创建 JNI 包装器

std::shared_ptr<xxx::FooInterface> createFooFactory() noexcept;

我得到的错误是这个

/Volumes/../../projects/xxx_fooFactory.cpp:34:19: error: reinterpret_cast from
      'std::__ndk1::shared_ptr<xxx::FooInterface>' to 'jlong' (aka 'long long') is not allowed
           return reinterpret_cast<jlong>(nativeObject);

我无法弄清楚我遗漏了什么或做错了什么,所有相关代码如下,如果有人可以就我可能遗漏的内容提供反馈/建议,那就太好了。我必须提到,这将是我第一次编写 jni 包装器。我有一个类 FooFactory.java

package xxx.FooFactory;

import PlatformInterface;

public class FooFactory extends PlatformInterface {
    protected FooFactory() {
    super();
    setNativeObject(nCreate());
    }

    @Override
    public void destroyNativeObject(long nativeObject) {
        destroyNativeObject(nativeObject);
    }

    private static native long nCreate();
    private static native void nDestroy(long nativeObject);
}

自动生成的 jni 标头 xxx_fooFactory.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class xxx_fooFactory */

#ifndef _Included_xxx_fooFactory
#define _Included_xxx_fooFactory
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     xxx_fooFactory
 * Method:    nCreate
 * Signature: ()J
 */
JNIEXPORT jlong JNICALL Java_xxx_fooFactory_nCreate
  (JNIEnv *, jclass);

/*
 * Class:     xxx_fooFactory
 * Method:    nDestroy
 * Signature: (J)V
 */
JNIEXPORT void JNICALL Java_xxx_fooFactory_nDestroy
  (JNIEnv *, jclass, jlong);

#ifdef __cplusplus
}
#endif
#endif

xxx_fooFactory.cpp

#include <jni.h>
#include "xxx_fooFactory.h"
....
#include <xxx/FooFactory.h>

using namespace xxx;
extern "C" {

/*
 * Class:     xxx_fooFactory
 * Method:    nCreate
 * Signature: ()J
 */
JNIEXPORT jlong JNICALL Java_xxx_fooFactory_nCreate
        (JNIEnv *env, jclass) {

    JAVA_BINDING_TRY{

           auto fooFactory = createFooFactory();
            if (fooFactory == nullptr) {
                throw JavaBindingException(JavaBindingException::kIllegalStateException, "Unable to create foo factory.");
            }

            auto nativeObject = std::shared_ptr<FooInterface>(fooFactory);
           return reinterpret_cast<jlong>(nativeObject);
    }
    JAVA_BINDING_CATCH(env);

    return 0;
}

/*
 * Class:     xxx_fooFactory
 * Method:    nDestroy
 * Signature: (J)V
 */
JNIEXPORT void JNICALL Java_xxx_fooFactory_nDestroy
(JNIEnv *env, jclass, jlong nativeObject) {
    JAVA_BINDING_TRY {
        if (nativeObject == 0) return;
        delete reinterpret_cast<std::shared_ptr<FooInterface>*>(nativeObject);
    } JAVA_BINDING_CATCH(env);
}

}
4

0 回答 0