I wrapped BASS library using Java Native Access(JNA) in Eclipse for sometime ago, and every methods I wanted, worked correctly.
Callbacks that I needed, also worked correctly.
Now I want to implement BASS_StreamCreateFileUser function, declared in C like below :
In JNA, I wrapped become :
This function require a structure, with 4 callbacks inside, declared in C like below :
And I wrapped in JNA as below :
Instancing a new variable in Java library as below :
And using it in my function as below :
Library compiled, and used in B4J, and it will return
Unsupported argument type jbass.JBass$Bass$BASS_FILEPROCS1 at parameter 2 of function BASS_StreamCreateFileUser
I have spent 5 working days trying to figure out this Structure , tried every combinations i know, yet no luck.
Anybody have idea on how making this BASS_FILEPROCS1 structure in JNA ?
Callbacks that I needed, also worked correctly.
Now I want to implement BASS_StreamCreateFileUser function, declared in C like below :
B4X:
HSTREAM BASS_StreamCreateFileUser(DWORD system, DWORD flags, BASS_FILEPROCS *procs, void *user);
In JNA, I wrapped become :
B4X:
int BASS_StreamCreateFileUser(int system, int flags, Object resultstruct, Object buffer1);
This function require a structure, with 4 callbacks inside, declared in C like below :
B4X:
void CALLBACK FileCloseProc(
void *user
);
QWORD CALLBACK FileLenProc(
void *user
);
DWORD CALLBACK FileReadProc(
void *buffer,
DWORD length,
void *user
);
BOOL CALLBACK FileSeekProc(
QWORD offset,
void *user
);
typedef struct {
FILECLOSEPROC *close;
FILELENPROC *length;
FILEREADPROC *read;
FILESEEKPROC *seek;
} BASS_FILEPROCS;
B4X:
public interface FILECLOSEPROC extends Callback{
void invoke(Object user);
}
public interface FILELENPROC extends Callback{
long invoke(Object user);
}
public interface FILEREADPROC extends Callback{
int invoke(ByteBuffer buffer, int length, Object user);
}
public interface FILESEEKPROC extends Callback{
boolean invoke(long offset, Object user);
}
public class BASS_FILEPROCS1 implements Structure.ByReference {
public FILECLOSEPROC filecloseproc;
public FILELENPROC filelenproc;
public FILEREADPROC filereadproc;
public FILESEEKPROC fileseekproc;
BASS_FILEPROCS1(){
filecloseproc = new FILECLOSEPROC(){
@Override
public void invoke(Object user) {
// TODO Auto-generated method stub
System.out.println("FILECLOSEPROC is called");
}
};
filelenproc = new FILELENPROC(){
@Override
public long invoke(Object user) {
// TODO Auto-generated method stub
System.out.println("FILELENPROC is called");
return 0;
}
};
filereadproc = new FILEREADPROC(){
@Override
public int invoke(ByteBuffer buffer, int length, Object user) {
// TODO Auto-generated method stub
System.out.println("FILEREADPROC is called");
return 0;
}
};
fileseekproc = new FILESEEKPROC(){
@Override
public boolean invoke(long offset, Object user) {
// TODO Auto-generated method stub
System.out.println("FILESEEKPROC is called");
return false;
}
};
};
}
Instancing a new variable in Java library as below :
B4X:
Bass.BASS_FILEPROCS1 myfileproc = new Bass.BASS_FILEPROCS1();
And using it in my function as below :
B4X:
public int bass_openstreamMP3(int flags) {
Buffer1.clear();
if (current_handle!=0) bass_stopcurrentplayback();
bass.BASS_SetDevice(BASS_ID);
try{
current_handle = bass.BASS_StreamCreateFileUser(BASS_CONSTANT.STREAMFILE_BUFFER, flags,myfileproc, null);
System.out.println("MP3 Stream handle="+current_handle);
} catch(Exception ex){
System.out.println(ex.getMessage());
}
if (current_handle!=0) raise_streamstart(BASS_ID); else raise_streamstop(BASS_ID);
return current_handle;
}
Library compiled, and used in B4J, and it will return
Unsupported argument type jbass.JBass$Bass$BASS_FILEPROCS1 at parameter 2 of function BASS_StreamCreateFileUser
I have spent 5 working days trying to figure out this Structure , tried every combinations i know, yet no luck.
Anybody have idea on how making this BASS_FILEPROCS1 structure in JNA ?