/
test_audio_jni.c
109 lines (89 loc) · 2.49 KB
/
test_audio_jni.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <jni.h>
#include <android/log.h>
#include "liekkas/src/opensl/lopensl.h"
#include "liekkas/src/opensl/opensl.h"
#include "liekkas/src/lk_util.h"
#include "liekkas/src/lk_decode.h"
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
static lua_State* L = NULL;
static void
_register(lua_State *L, lua_CFunction func, const char * libname) {
luaL_requiref(L, libname, func, 0);
lua_pop(L, 1);
}
static int
traceback(lua_State *L) {
const char *msg = lua_tostring(L, 1);
if (msg)
luaL_traceback(L, L, msg, 1);
else if (!lua_isnoneornil(L, 1)) {
if (!luaL_callmeta(L, 1, "__tostring"))
lua_pushliteral(L, "(no error message)");
}
return 1;
}
static int
_readall(lua_State* L) {
const char* path = lua_tostring(L, 1);
struct util_fp* handle = util_file_open(path);
if(!handle){
lua_pushnil(L);
}else {
size_t sz = util_file_size(handle);
char tmp[sz];
util_file_readall(handle, tmp, sz);
lua_pushlstring(L, tmp, sz);
util_file_close(handle);
}
return 1;
}
static int
l_util(lua_State* L) {
luaL_Reg l[] = {
{"readall", _readall},
{NULL, NULL},
};
luaL_newlib(L, l);
return 1;
}
JNIEXPORT void JNICALL
Java_com_example_testaudio_TestAudio_testInit(JNIEnv* env, jclass clazz) {
const char* lua_src = "android_test.lua";
L = luaL_newstate();
struct util_fp* handle = util_file_open(lua_src);
if(!handle) {
sl_log("open %s error\n", lua_src);
return;
}
size_t sz = util_file_size(handle);
char src[sz];
util_file_readall(handle, src, sz);
luaL_openlibs(L);
_register(L, l_util, "util");
_register(L, luaopen_liekkas, "liekkas");
_register(L, bgm_android, "liekkas.bgm");
_register(L, luaopen_liekkas_decode, "liekkas.decode");
lua_pushcfunction(L, traceback);
int top = lua_gettop(L);
if(luaL_loadbuffer(L, (const char*)src, sz, "android_test.lua") != LUA_OK) {
const char* err = lua_tostring(L, -1);
sl_log("android jni error: %s\n", err);
goto EXIT;
}
if(lua_pcall(L, 0, 0, top) != LUA_OK) {
const char* err = lua_tostring(L, -1);
sl_log("lua error: %s\n", err);
goto EXIT;
}
EXIT:
util_file_close(handle);
}
JNIEXPORT void JNICALL
Java_com_example_testaudio_TestAudio_testDestory(JNIEnv* env, jclass clazz) {
sl_log("Java_com_example_testaudio_TestAudio_testDestory!!!\n");
if(L) {
lua_close(L);
}
}