【问题标题】:How to call C++ static function of a class using JNI for android如何使用 JNI for android 调用类的 C++ 静态函数
【发布时间】:2012-10-22 14:56:36
【问题描述】:

我正在做一个将使用 C++ 库的 android 应用程序。出于这个原因,我需要使用 Android-NDK 构建 C++ 项目。但是我现在面临的问题是如何使用JNI调用C++静态函数。

在我的 C++ 代码中,我有一个单例类。众所周知,要实现一个单例类,我们需要引入负责创建此类实例的静态函数。现在我需要使用 JNI 调用静态函数来创建一个可以在我的 android 应用程序中使用的实例。

【问题讨论】:

  • 这里有什么问题? JNI C++ 方法可以调用静态 C++ 方法。您是否尝试将整个单例对象传递给 Java?
  • 是的。如何将单例对象传递给 Java?
  • 其实我需要的是在android中使用单例对象来访问单例类的成员函数。谢谢。

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


【解决方案1】:

你可以在 JNI 端做:

long Java_mypackage_com_createSingleton(JNIEnv* env)
{
     return MySingleton::getInstance();
}

bool Java_mypackage_com_useSingletonSomehow(long singleton) 
{
      return (MySingleton*)singleton->someFunc();
}

在单例类中:

   MySingleton* getInstance() 
    {
      if(instance_ == NULL)
      {
          instance_ = new MySingleton();
      }
      return instance_;

    }

在 Java 方面:

package mypackage.com;

class SingletonUser
{
private long mSingletonInstance;

public SingletonUser() {
   mSingleton = createSingleton();
}

public boolean someFunc() {
   return useSingletonSomehow(mSingletonInstance);
}

private native boolean useSingletonSomehow(long instance);
private native long createSingleton();

}

【讨论】:

  • 假设我的单例类有一个成员函数名 Create()。因此,要调用 Create() 函数,我需要按以下方式调用。是对是错?bool Java_mypackage_com_useSingletonSomehow(long singleton) { return (MySingleton*)singleton->Create(); }
  • 是的。 JNI 函数必须是 C 函数,但您当然可以从中调用任何 C++ 代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
  • 2019-12-07
  • 2022-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多