First, the strcat() function call you are doing is dangerous. It’s writing past the bounds of the utf8String array and will trash memory. This is because the CreateUtf8StringFrom() function creates a char array just long enough to hold all of the characters it needs, leaving no room for string concatenation. I’ll bet it’s turning your appPath into an invalid path because it’s not null terminated where you expect it to be.
It might be easier to return the absolute path to Lua and do the file copy from there. This is because you don’t have easy access to Corona’s sandboxed directory paths at the moment on the C/C++ side. Lua’s standard file io APIs can work with paths outside of Corona’s sandboxed directories. We provide example code on how to copy a file here…
https://docs.coronalabs.com/guide/data/readWriteFiles/index.html#copying-files-to-subfolders
And if you need to create a subdirectory, then you can use Lua’s lfs.mkdir() function as shown here…
https://docs.coronalabs.com/api/library/lfs/index.html#working-with-directories
Now, if you don’t want to do the above in Lua and handle it on the C/C++ side, then it’s going to be a bit more work, but it’s definitely possible. Your Lua code would have to pass in either a destination directory path to your C function or the base directory constant (ie: system.DocumentsDirectory, system.CachesDirectory, etc.). The following link shows you how our “pasteboard” plugin does it by passing in a Corona base directory constant. This is how we normally do it for “official” plugins that we would make publically available. The trick is that your C/C++ code will have to call the Lua system.pathForFile() function, which is what the link below will show you. Or you could keep it simple and do it on the Lua side like I mentioned above. It’s up to you. 
https://github.com/coronalabs/plugins-source-pasteboard/blob/master/ios/Plugin/pasteboardPlugin.mm#L255