Java 将字符串发送到C++;从使用JNI的Android应用程序

Java 将字符串发送到C++;从使用JNI的Android应用程序,java,android,c++,android-ndk,java-native-interface,Java,Android,C++,Android Ndk,Java Native Interface,我正在尝试发送一个动态字符串,该字符串是使用JNI从Android应用程序的最终用户处获取的。 虽然在互联网上搜索了类似的例子,但对我来说,像一个新手一样,解决这个问题是相当复杂的 我正在分享我的代码,下面是每个文件的代码 MainActivity.java public class MainActivity extends AppCompatActivity { static { System.loadLibrary("native-lib"); } pu

我正在尝试发送一个动态字符串,该字符串是使用JNI从Android应用程序的最终用户处获取的。 虽然在互联网上搜索了类似的例子,但对我来说,像一个新手一样,解决这个问题是相当复杂的

我正在分享我的代码,下面是每个文件的代码

MainActivity.java

public class MainActivity extends AppCompatActivity {

   static {

      System.loadLibrary("native-lib");

   }

   public native int initialize();

   // i want to send params like String from android App in the below method , what is the proper way to do it.
   // public native int sendData(String param1 , String param2);


}
本机lib.cpp

#include "jni.h"

extern "C"
JNIEXPORT jint JNICALL
Java_com_newapp_myapp_MainActivity_initialize(JNIEnv *env, jobject instance){

    activity = env->NewGlobalRef(instance);
    return my_initialize(my_jvm, activity);
}
main.h

#ifdef __cplusplus
extern "C" {
#endif

#ifndef MAIN_H
#define MAIN_H

#include "jni.h"

int my_initialize(_JavaVM*, jobject);

#endif

#ifdef __cplusplus
}
#endif
我的问题是,如何将一个方法中的字符串参数从Android发送到C++。例如,在MaunActudio中实现StEdDATA()方法,JNI文件的等效代码,C++文件的等效代码。
注意:代码非常庞大,这就是我共享该代码段的原因。代码工作正常。

假设您的文件是:

public class AppCompatActivity {

}

你所要做的一切如下:

> javac -h . MainActivity.java
> cat MainActivity.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class MainActivity */

#ifndef _Included_MainActivity
#define _Included_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     MainActivity
 * Method:    sendData
 * Signature: (Ljava/lang/String;Ljava/lang/String;)I
 */
JNIEXPORT jint JNICALL Java_MainActivity_sendData
  (JNIEnv *, jobject, jstring, jstring);

#ifdef __cplusplus
}
#endif
#endif
>javac-h。MainActivity.java
>猫的活动
/*不要编辑此文件-它是机器生成的*/
#包括
/*类活动的标题*/
#ifndef包括了主要活动
#定义包含的主活动
#ifdef_uucplusplus
外部“C”{
#恩迪夫
/*
*类别:主要活动
*方法:sendData
*签名:(Ljava/lang/String;Ljava/lang/String;)I
*/
JNIEXPORT jint JNICALL Java\u main活动\u sendData
(JNIEnv*,jobject,jstring,jstring);
#ifdef_uucplusplus
}
#恩迪夫
#恩迪夫

<代码> > java< /Cord>或 JavaC> /Cord>可以基于java声明生成C++声明。只是到处搜索-必须有很多例子来说明如何做。JNI代码也从Android工作室自动生成,但是我想知道JNI代码和C++代码中使用的数据类型,我不遵守。如果你已经自动生成C++头,那么你就应该已经有了一个C++原型,用于<代码> sDeDATAs/COD>,所以你应该知道它将收到两个<代码> JStord< /Calp>(除了<代码> JNIENV*<代码>和 <代码> >。你必须遵循严格的命名约定才能解决它。您可以将javah或javac与头的位置一起使用,以生成正确的方法signature.Wow。这很有用。但是我也需要为C++文件写头文件。我是否必须在cpp方法签名中使用与jstring相同的数据类型,并包含jni.hf作为示例。假设我编写方法passData(jstring_var1,jstring_var2);在JavaSnMaDeVistyyStDATA(){}中,可以使用C和C++两个相同的报头。请看这里的示例,我称之为C++代码:-您可以在这里找到示例代码:在这里,您可以找到基于C++的JNI包装器调用C++的示例:
> javac -h . MainActivity.java
> cat MainActivity.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class MainActivity */

#ifndef _Included_MainActivity
#define _Included_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     MainActivity
 * Method:    sendData
 * Signature: (Ljava/lang/String;Ljava/lang/String;)I
 */
JNIEXPORT jint JNICALL Java_MainActivity_sendData
  (JNIEnv *, jobject, jstring, jstring);

#ifdef __cplusplus
}
#endif
#endif