Android在Java代码中使用tinyalsa

Android在Java代码中使用tinyalsa,android,android-ndk,tinyalsa,Android,Android Ndk,Tinyalsa,我使用源代码构建了tinyalsa库,并用JNI调用对其进行了包装,我正试图在代码中使用它。 我曾经生成Java包装(并修改输出以符合我的包) 我的本机方法声明是: public final static native long mixer_open(long jarg); 我的JNI包装调用位于根pacakge下的包装类TinyAlsa.java中(例如,我将使用com.example.App): 我的包装器c方法是: SWIGEXPORT jlong JNICALL Java_com_Ex

我使用源代码构建了tinyalsa库,并用JNI调用对其进行了包装,我正试图在代码中使用它。

我曾经生成Java包装(并修改输出以符合我的包) 我的本机方法声明是:

public final static native long mixer_open(long jarg);
我的JNI包装调用位于根pacakge下的包装类TinyAlsa.java中(例如,我将使用com.example.App):

我的包装器c方法是:

SWIGEXPORT jlong JNICALL Java_com_Example_App_Native_TinyAlsaJNI_mixer_1open(JNIEnv *jenv, jclass jcls, jlong jarg1) 
{
    jlong jresult = 0 ;
    unsigned int arg1 ;
    struct mixer *result = 0 ;

    (void)jenv;
    (void)jcls;
    arg1 = (unsigned int)jarg1; 
    result = (struct mixer *)mixer_open(arg1);
    *(struct mixer **)&jresult = result; 
    return jresult;
}
tinalsa库加载正常,没有异常,但诸如
mixer\u open(0)
之类的调用返回空指针。
但是,如果我执行已编译的tinymix混音器,则该混音器是打开的,并且混音器控件应按原样列出。

我错过什么了吗?我怎样才能从我的代码中工作?

代码可能会让你更容易知道你遗漏了什么删除了我的答案,因为我意识到我误读了你的代码。但是您将返回操作复杂化了-只需将其更改为返回(long-long)mixer_-open(arg1);您可能缺少一些init代码,我会在这个函数中放置一个日志或断点,以查看open本身是否返回NULL。如果是这样,那么您缺少某种init函数。c代码是使用Swig生成的。我怀疑它确实使事情变得过于复杂,但是-由于这段代码最终访问混音器信息,这在没有root的情况下很可能是不允许的,所以我正在试图弄清楚,如果代码本身不是问题的话,我是否应该做些别的事情使它工作(除了在调用alsa方法之前调用su)。。
SWIGEXPORT jlong JNICALL Java_com_Example_App_Native_TinyAlsaJNI_mixer_1open(JNIEnv *jenv, jclass jcls, jlong jarg1) 
{
    jlong jresult = 0 ;
    unsigned int arg1 ;
    struct mixer *result = 0 ;

    (void)jenv;
    (void)jcls;
    arg1 = (unsigned int)jarg1; 
    result = (struct mixer *)mixer_open(arg1);
    *(struct mixer **)&jresult = result; 
    return jresult;
}