Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JNI将java base64字符串传递给C++;并将base64字符串返回到java 你好,我用JNI和IM尝试构建一个Android应用程序,试图把Base64字符串传递给C++,然后返回Base64字符串。我使用JavaX.Cudi.Civer库加密Base64字符串,并将该字符串发送给C++,并使用C++来使用该字符串。但由于某种原因,当我将该字符串传递给JNI时,它并没有显示出来。下面是我的代码片段 enter code here //MyJobService.java public class MyJobService extends JobService { NativeLibrary ni = new NativeLibrary(); public void httpRequest() { AES128 encrypted = AES128.encrypt("MyKey", String.valueOf("My input string")); ni.request(encrypted.toString()) } } //NativeLibrary.java public class NativeLibrary extends AsyncTask<String, Void, String> { static { System.loadLibrary("native-lib"); } public native String request(String encryptStr); } //native-lib.cpp extern "C" JNIEXPORT jstring JNICALL Java_com_example_mobileapp_NativeLibrary_request(JNIEnv *env,jobject instance, jstring encStr) { __android_log_write(ANDROID_LOG_DEBUG, "ENC_STRING", (char *) encStr); // .. do something return (char *) encStr; } 在此处输入代码 //MyJobService.java 公共类MyJobService扩展了JobService { NativeLibrary ni=新的NativeLibrary(); 公共无效httpRequest() { AES128 encrypted=AES128.encrypt(“我的密钥”,String.valueOf(“我的输入字符串”); ni.request(加密的.toString()) } } //NativeLibrary.java 公共类NativeLibrary扩展异步任务 { 静止的{ 加载库(“本机库”); } 公共本机字符串请求(字符串加密); } //native-lib.cpp 外部“C”JNIEXPORT jstring JNICALL Java_com_示例_mobileapp_NativeLibrary_请求(JNIEnv*env,jobject 实例,jstring encStr) { __android_log_write(android_log_DEBUG,“ENC_STRING”,(char*)encStr); //做点什么 返回(字符*)encStr; }_Java_Android_C++_Java Native Interface - Fatal编程技术网

JNI将java base64字符串传递给C++;并将base64字符串返回到java 你好,我用JNI和IM尝试构建一个Android应用程序,试图把Base64字符串传递给C++,然后返回Base64字符串。我使用JavaX.Cudi.Civer库加密Base64字符串,并将该字符串发送给C++,并使用C++来使用该字符串。但由于某种原因,当我将该字符串传递给JNI时,它并没有显示出来。下面是我的代码片段 enter code here //MyJobService.java public class MyJobService extends JobService { NativeLibrary ni = new NativeLibrary(); public void httpRequest() { AES128 encrypted = AES128.encrypt("MyKey", String.valueOf("My input string")); ni.request(encrypted.toString()) } } //NativeLibrary.java public class NativeLibrary extends AsyncTask<String, Void, String> { static { System.loadLibrary("native-lib"); } public native String request(String encryptStr); } //native-lib.cpp extern "C" JNIEXPORT jstring JNICALL Java_com_example_mobileapp_NativeLibrary_request(JNIEnv *env,jobject instance, jstring encStr) { __android_log_write(ANDROID_LOG_DEBUG, "ENC_STRING", (char *) encStr); // .. do something return (char *) encStr; } 在此处输入代码 //MyJobService.java 公共类MyJobService扩展了JobService { NativeLibrary ni=新的NativeLibrary(); 公共无效httpRequest() { AES128 encrypted=AES128.encrypt(“我的密钥”,String.valueOf(“我的输入字符串”); ni.request(加密的.toString()) } } //NativeLibrary.java 公共类NativeLibrary扩展异步任务 { 静止的{ 加载库(“本机库”); } 公共本机字符串请求(字符串加密); } //native-lib.cpp 外部“C”JNIEXPORT jstring JNICALL Java_com_示例_mobileapp_NativeLibrary_请求(JNIEnv*env,jobject 实例,jstring encStr) { __android_log_write(android_log_DEBUG,“ENC_STRING”,(char*)encStr); //做点什么 返回(字符*)encStr; }

JNI将java base64字符串传递给C++;并将base64字符串返回到java 你好,我用JNI和IM尝试构建一个Android应用程序,试图把Base64字符串传递给C++,然后返回Base64字符串。我使用JavaX.Cudi.Civer库加密Base64字符串,并将该字符串发送给C++,并使用C++来使用该字符串。但由于某种原因,当我将该字符串传递给JNI时,它并没有显示出来。下面是我的代码片段 enter code here //MyJobService.java public class MyJobService extends JobService { NativeLibrary ni = new NativeLibrary(); public void httpRequest() { AES128 encrypted = AES128.encrypt("MyKey", String.valueOf("My input string")); ni.request(encrypted.toString()) } } //NativeLibrary.java public class NativeLibrary extends AsyncTask<String, Void, String> { static { System.loadLibrary("native-lib"); } public native String request(String encryptStr); } //native-lib.cpp extern "C" JNIEXPORT jstring JNICALL Java_com_example_mobileapp_NativeLibrary_request(JNIEnv *env,jobject instance, jstring encStr) { __android_log_write(ANDROID_LOG_DEBUG, "ENC_STRING", (char *) encStr); // .. do something return (char *) encStr; } 在此处输入代码 //MyJobService.java 公共类MyJobService扩展了JobService { NativeLibrary ni=新的NativeLibrary(); 公共无效httpRequest() { AES128 encrypted=AES128.encrypt(“我的密钥”,String.valueOf(“我的输入字符串”); ni.request(加密的.toString()) } } //NativeLibrary.java 公共类NativeLibrary扩展异步任务 { 静止的{ 加载库(“本机库”); } 公共本机字符串请求(字符串加密); } //native-lib.cpp 外部“C”JNIEXPORT jstring JNICALL Java_com_示例_mobileapp_NativeLibrary_请求(JNIEnv*env,jobject 实例,jstring encStr) { __android_log_write(android_log_DEBUG,“ENC_STRING”,(char*)encStr); //做点什么 返回(字符*)encStr; },java,android,c++,java-native-interface,Java,Android,C++,Java Native Interface,JNIENVInterface公开一组函数表,以检索从JAVA前端传递的参数。 在您的例子中,需要使用GetStringUTFChars()从Java读取jstring- //native-lib.cpp extern "C" JNIEXPORT jstring JNICALL Java_com_example_mobileapp_NativeLibrary_request(JNIEnv *env,jobject instance, jstring encStr)

JNIENVInterface公开一组函数表,以检索从JAVA前端传递的参数。

在您的例子中,需要使用GetStringUTFChars()从Java读取jstring-

//native-lib.cpp
extern "C" JNIEXPORT jstring JNICALL 
Java_com_example_mobileapp_NativeLibrary_request(JNIEnv *env,jobject 
instance, jstring encStr)
    {
      char *utfString = (char *) (env)->GetStringUTFChars(encStr, NULL);
      __android_log_print(ANDROID_LOG_DEBUG, "ENC_STRING = %s", utfString);
          // .. do something
      return env->NewStringUTF(utfString);//modified string returned
    }

return(char*)encStr--为什么要在此处应用强制转换?
encStr
已经是一个
jstring
。即便如此,如果您拥有的是一个C风格的字符串,那么将其转换为JVM管理的java
string
(我认为使用的是
NewStringUTF
)所需的时间远远超过所显示的代码。日志调用也不正确,因为您无法通过强制转换从
jstring
获得
char*
。您需要使用并
发布StringUTFChars
。谢谢,使用NewStringUTF方法,我能够查看并返回jstring。