Java,JNI和类声明

时间:2016-12-21 09:31:04

标签: java java-native-interface

任何JNI专家都可以解释以下情况,因为我无法解决这个问题。

假设我们有这门课程:

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        // Register your parse models
        ParseObject.registerSubclass(GameScore.class); // for example

        Parse.enableLocalDatastore(this);
        Parse.initialize(new Parse.Configuration.Builder(context)
                .applicationId(APPLICATION_ID)
                .server(SERVER)
                .build()
        );
    }
}
在JNI(C)中

public static int solution(int[] A)
{
    Array.Sort(A);
    List<int> missing = new List<int>();
    List<int> An = new List<int>();

    foreach (var r in A)
    {
        if (r > 0)
        {
            An.Add(r);
        }

    }
    int lengthList = (An[An.Count]) - (An[0]);

    for (int i = An[0]; i <= lengthList - 1; i++)
    {
        if (An[i + 1] != An[i] + 1)
        {
            missing.Add(An[i] + 1);
            An.Insert(i + 1, An[i] + 1);
        }
    }
    if (missing != null)
    {
        return missing[0];
    }
    else
        return 0;
}

但是,如果不是

,这样可以正常工作
public class MyClass {
    static {
        System.loadLibrary("recorder");
    }

    private native long function1();    
    private native void function2();

    private void callback() {

    }

    public static void main(String[] args) throws Exception {
        MyClass obj1 = new MyClass();
        obj1.function1();
    }

}

我宣布

JNIEXPORT jstring JNICALL function1(JNIEnv *env, jobject object) {
   jclass cls = (*env)->GetObjectClass(env, object);
   jmethodID mid = (*env)->GetMethodID(env, cls, "callback", "()V");

   if (mid != NULL) {
        (*env)->CallVoidMethod(env, object, mid);
   }
}
从JNI到Java的调用失败,抱怨它无法在Java中找到函数回调。

由于

1 个答案:

答案 0 :(得分:1)

对于静态本机方法,本机代码中的第二个参数不应该是jobject而是jclass

但您应该使用javah工具生成c标头,而不是手动编写它们。