【问题标题】:How to create native class using JNI?如何使用 JNI 创建原生类?
【发布时间】:2017-07-20 08:46:36
【问题描述】:

我想用构造函数和一个返回字符串的方法创建 C++ 类。我的问题是:如何使用 C++ 构造函数在 Java 中初始化“本机类”类型的对象,然后从这个 Java 对象调用本机方法?

【问题讨论】:

  • 要明确一点:Native = C,而不是 C++。你不能将 C++ 与 JNI 一起使用,除非你创建一个将 C 与 Java 绑定的接口,然后在 C 中实例化 C++ 类,后者使用 C++ 编译器编译,因为 C++ 编译器理解 C。
  • 请通过链接链接:github.com/googlesamples/android-ndk。我相信它会对你有所帮助。
  • @TheQuantumPhysicist 这完全不正确。只要原生 JNI 方法观察到javah 生成的签名,就可以使用 C++。二十年前我就这样做了。
  • @TheQuantumPhysicist 是的。我已经做到了。这就是javah 生成extern "C" 语句的原因。
  • @EJP 是的,这是您的意见。如果javah 生成本机接口,这并不意味着 C++ ABI 可以直接与 JNI 接口。 NATIVE = C. 无论你如何绕开这个事实,它仍然是正确的。否则 SWIG 之类的工具将毫无用处。你显然不明白我在说什么,并且被你的经验所驱动,而不是学习或理解你的同龄人的意愿。我真的没有时间对你的判断态度。

标签: java android c++ java-native-interface native


【解决方案1】:

Java 中没有“本机类”;我们有可以成为任何 Java 类的一部分的“本机方法”。本机方法实现为extern "C" 函数。

简而言之,您可以在 Java 中创建两个本地方法,例如createNativeInstancegetNativeString。请注意,您可能需要另一种方法来释放本机实例:

#include <jni.h>

JNIEXPORT
jlong Java_test_createNativeInstance(JNIEnv *, jobject ) {
    return reinterpret_cast<jlong>(new CppClass());
}

JNIEXPORT
jstring Java_test_getNativeString(JNIEnv *env, jobject obj, jlong cppClassPtr) {
    CppClass* pCppClass = reinterpret_cast<CppClass*>(cppClassPtr);
    return env->NewStringUTF(env, pCppClass->getString();
}

JNIEXPORT
void Java_test_releaseNativeInstance(JNIEnv *env, jobject obj, jlong cppClassPtr) {
    CppClass* pCppClass = reinterpret_cast<CppClass*>(cppClassPtr);
    delete pCppClass;
}

【讨论】:

    猜你喜欢
    • 2011-11-07
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 2017-04-29
    • 2018-12-16
    • 2018-08-11
    相关资源
    最近更新 更多