java - 使用 JNI 从 Android 应用程序向 C++ 发送字符串

标签 java android c++ android-ndk java-native-interface

我正在尝试发送一个动态字符串,它是使用 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);


}

native-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);
}

ma​​in.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++。例如在 MainActivity 中实现 sendData() 方法,JNI 文件的等效代码和 C++ 文件的相同代码。

注意:代码非常庞大,这就是我共享代码 fragment 的原因。代码运行正常。

最佳答案

假设您的文件是:

public class AppCompatActivity {

}

public class MainActivity extends AppCompatActivity {

   static {
      System.loadLibrary("native-lib");
   }

   public native int sendData(String param1 , String param2);

}

所有你需要做的如下:

> 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

关于java - 使用 JNI 从 Android 应用程序向 C++ 发送字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57159074/

相关文章:

java - 根据屏幕分辨率以编程方式创建 View

java - H2:无法从 jar 内的 sql 文件初始化数据库模式

c++ - 尝试构建 torchscript 扩展会导致 INVALID TYPE : Only int64_t and bool are supported as an integral argument type error

c++ - TBB Concurrent Vector 和 STL Vector 的区别?

javascript - 哪些编译器针对 JavaScript 运行时?

java - 使用列表中资源中的字符串。

android - Google Play 游戏服务 - 解锁的成就弹出窗口未显示

android eclipse jedisct1/libsodium 从哪里开始

c++ - 游戏中的多态性

java - 如何强制 JCombox 处于选定状态