0

我有一个问题需要解决:

我有一个带有本机方法的java,它创建一个对象并利用该对象的方法。这是我的 java 代码:我有一个名为 IssmJni 的 java 文件,它包含一个本地方法:

public static native long fac(long n);
    static {
        System.loadLibrary("FacLib");
    }
public static long facIterative(long n)
{
    return fac(n);

在我的主要课程中,我有这个:

long result = IssmJni.facIterative(Long.parseLong(input));
    System.out.println(result);

这是我的 C++ 代码:主文件:

static jlong factorial(JNIEnv *env, jclass clazz, jlong n)
    {
        fac *f = new fac();
        jlong result = (jlong) (f->factorial(n));
        delete(f);
        return (jlong) result;
    }

头文件:

class fac
{
    public:
    long factorial(long n);
};

fac.cpp:

#include "com_lan_factorial_FacLib.h"
#include "fac.h"

long fac::factorial(long n)
{
    long f = 1;
    long i;
    for(i = 1; i <= n; i++)
    {
         f *= i;
    }
    return f;
}

一切正常,所以发生的情况是 UI 将输入一个数字,称为 C++ 代码并生成一个新对象调用 fac,并在该类 fac 中使用方法阶乘。通过这条线

fac *f = 新 fac(); jlong​​ 结果 = (jlong​​) (f->factorial(n));

我想要的是保持相同的对象 fac,但使用具有不同输入的阶乘方法。我尽量远离 pthread,因为它太复杂了。有没有一种方法可以创建另一个 java 线程并在我的应用程序的整个过程中保持该对象处于活动状态,并在我有新的用户输入时使用该阶乘。然后在应用程序死亡时摆脱这个对象?

总之,我想保留 1 个对象 fac 实例,并多次使用阶乘方法。不做原生pthread有可能吗?谢谢

4

1 回答 1

0

这就是我想出的。

static fac* pfac = NULL;

namespace com_lan_factorial
{
    static jlong factorial(JNIEnv *env, jclass clazz, jlong n)
    {
        pfac = new fac();
        jlong result = (jlong) (pfac->factorial(n));
        return (jlong) result;
    }

    static jlong factorial_ten(JNIEnv *env, jclass clazz)
    {
        jlong result = (jlong) (pfac->factorial(3));
        return (jlong) result;
    }

所以我创建了一个名为 pfac 的指针,在第一次运行时 pfac 将被分配给一个新对象 pfac = new fac(); 在第二次运行时,我只是重用了 pfac 指针并调用了阶乘函数。这完全有效,但我不确定这是用 2 个阶乘方法创建 2 个 fac 对象,还是只用 1 个 fac 方法和相同的阶乘方法。任何人都可以验证。谢谢

于 2012-11-17T02:44:59.687 回答