Working on trying to pass objects, unwrap them to C/C++ types, do something, then return the result as an object. Now I get why people say JNI is tricky

This commit is contained in:
amazing-username
2019-10-10 18:40:16 -04:00
parent 6b746cd1d0
commit 878c62f2cb
24 changed files with 337 additions and 843 deletions
+40 -3
View File
@@ -251,7 +251,7 @@ Java_com_example_mear_activities_LoginActivity_retrieveSong(
extern "C"
JNIEXPORT jobject
JNICALL
Java_com_example_mear_activities_LoginActivity_retrieveUserCredentials(
Java_com_example_mear_repositories_UserRepository_retrieveUserCredentials(
JNIEnv *env,
jobject thisObj,
jstring dataPath
@@ -275,6 +275,43 @@ Java_com_example_mear_activities_LoginActivity_retrieveUserCredentials(
return userObj;
}
extern "C"
JNIEXPORT jobject
JNICALL
Java_com_example_mear_repositories_UserRepository_logUser(
JNIEnv *env,
jobject thisObj,
jobject user,
jstring apiUri ) {
jclass userClass = env->GetObjectClass(user);
//auto tok = env->CallObjectMethod(token, env->GetMethodID(tokenClass, "setAccessToken", "(Ljava/lang/String;)V"));
auto passwordField = env->GetFieldID(userClass, "getPassword", "(Ljava/lang/String;)V");
//auto passwordM = env->CallObjectMethod(user, env->GetMethodID(userClass, "password", "(Ljava/lang/String;)V"));
//auto passwordMOne = env->CallObjectMethod(user, env->GetMethodID(userClass, "getPassword", "(Ljava/lang/String;)V"));
auto password = env->GetObjectField(user, passwordField);
//auto username = env->CallObjectMethod(user, env->GetMethodID(userClass, "setUsername", "(Ljava/lang/String;)V"));
auto usernameField = env->GetFieldID(userClass, "setUsername", "(Ljava/lang/String;)V");
auto username = env->GetObjectField(user, usernameField);
const std::string usr = env->GetStringUTFChars((jstring)username, nullptr);
const std::string pass = env->GetStringUTFChars((jstring)password, nullptr);
const std::string api = env->GetStringUTFChars(apiUri, nullptr);
model::Token token(fetchToken(usr, pass, api));
jclass tokenClass = env->FindClass( "com/example/mear/models/Token");
jmethodID jconstructor = env->GetMethodID( tokenClass, "<init>", "()V" );
jobject tokenObj = env->NewObject( tokenClass, jconstructor );
jmethodID tokenAccess = env->GetMethodID( tokenClass, "setAccessToken", "(Ljava/lang/String;)V" );
jstring title = env->NewStringUTF(token.accessToken.c_str());
env->CallVoidMethod(tokenObj, tokenAccess, title);
return tokenObj;
}
extern "C"
JNIEXPORT jstring
@@ -299,7 +336,7 @@ Java_com_example_mear_activities_LoginActivity_logUser(
extern "C"
JNIEXPORT jboolean
JNICALL
Java_com_example_mear_activities_LoginActivity_isUserTableEmpty(
Java_com_example_mear_repositories_UserRepository_isUserTableEmpty(
JNIEnv *env,
jobject thisObj,
jstring dataPath
@@ -313,7 +350,7 @@ Java_com_example_mear_activities_LoginActivity_isUserTableEmpty(
extern "C"
JNIEXPORT jboolean
JNICALL
Java_com_example_mear_activities_LoginActivity_doesDatabaseExist(
Java_com_example_mear_repositories_BaseRepository_doesDatabaseExist(
JNIEnv *env,
jobject thidObj,
jstring dataPath
@@ -11,7 +11,9 @@ import kotlinx.android.synthetic.main.content_login.*
import org.jetbrains.anko.toast
import com.example.mear.models.Song
import com.example.mear.models.Token
import com.example.mear.models.User
import com.example.mear.repositories.UserRepository
class LoginActivity : BaseServiceActivity() {
@@ -24,12 +26,12 @@ class LoginActivity : BaseServiceActivity() {
private external fun retrieveSong(tok: String, api: String, songId: Int): Song
private external fun retrieveUserCredentials(path: String): User
//private external fun retrieveUserCredentials(path: String): User
private external fun logUser(usr: String, pass: String, api: String): String
private external fun doesDatabaseExist(path: String): Boolean
private external fun isUserTableEmpty(path: String): Boolean
//private external fun doesDatabaseExist(path: String): Boolean
//private external fun isUserTableEmpty(path: String): Boolean
private external fun pathIteratorDemo(path: String)
private external fun saveUserCredentials(username: String, password: String, appDir: String)
@@ -41,8 +43,9 @@ class LoginActivity : BaseServiceActivity() {
setSupportActionBar(toolbar)
val pa = appDirectory()
if (doesDatabaseExist(pa) && !isUserTableEmpty(pa)) {
val usr = retrieveUserCredentials(pa)
val usrRepo = UserRepository()
if (usrRepo.databaseExist(pa) && !usrRepo.isTableEmpty(pa)) {
val usr = usrRepo.retrieveCredentials(pa)
username.setText(usr.username)
password.setText(usr.password)
}
@@ -71,22 +74,26 @@ class LoginActivity : BaseServiceActivity() {
val saveCred = saveUserCred.isChecked
val usernameStr = username.text.toString()
val passwordStr = password.text.toString()
var apiUriStr = apiUri.text.toString()
val usr = User()
usr.username = username.text.toString()
usr.password = password.text.toString()
if (apiUriStr.isEmpty()) {
apiUriStr = ""
apiUriStr = "https://www.soaricarus.com"
}
val token = logUser(usernameStr, passwordStr, apiUriStr)
val myToken = Token(logUser(usr.username, usr.password, apiUriStr))
//val token = logUser(usernameStr, passwordStr, apiUriStr)
val usrRepo = UserRepository()
//val newToken = usrRepo.fetchToken(usr, apiUriStr)
try {
val songId = 4
val song = retrieveSong(token, apiUriStr, songId)
val song = retrieveSong(myToken.accessToken, apiUriStr, songId)
val pa = appDirectory()
if (saveCred && isUserTableEmpty(pa)) {
saveUserCredentials(usernameStr, passwordStr, pa)
if (saveCred && usrRepo.isTableEmpty(pa)) {
saveUserCredentials(usr.username, usr.password, pa)
}
//startActivity(Intent(this, IcarusSongActivity::class.java))
}
@@ -0,0 +1,17 @@
package com.example.mear.repositories
open class BaseRepository {
companion object {
init {
System.loadLibrary("native-lib")
}
}
private external fun doesDatabaseExist(path: String): Boolean
fun databaseExist(path: String): Boolean {
return doesDatabaseExist(path)
}
}
@@ -0,0 +1,37 @@
package com.example.mear.repositories
import com.example.mear.models.Token
import com.example.mear.models.User
class UserRepository : BaseRepository() {
private external fun logUser(user: User, apiUri: String) : Token
private external fun retrieveUserCredentials(path: String) : User
private external fun isUserTableEmpty(path: String): Boolean
private external fun saveUserCredentials(username: User)
fun fetchToken(user: User, apiUri: String): Token {
val usr = logUser(user, apiUri)
return usr
}
fun retrieveCredentials(path: String): User {
return retrieveUserCredentials(path)
}
fun isTableEmpty(path: String): Boolean {
return isUserTableEmpty(path)
}
fun saveCredentials(user: User) {
saveUserCredentials(user)
}
}