2015-09-14 36 views
0

我想在Android中使用本地代码从C++文件中调用java方法。我知道,我们可以通过JNI实现这一点,但在这种情况下,我需要发起Java调用,这不符合我的要求。Android中的C++和Java之间的通信

我需要在C++中调用main()函数用Java编写的方法。

那么有没有其他的方法来实现这个没有JNI?

如果我能用JNI来实现这个事情,请告诉我怎么做?

在此先感谢。

谢谢你, Maulik

回答

0

你检查这一点:
https://developer.android.com/ndk/samples/sample_hellojni.html 我基本上从那里学到。或者:
1. https://github.com/sureshjoshi/android-ndk-swig-example
2. https://github.com/googlesamples/android-ndk
一个简单的搜索会让你在所有这些地方。
Calling a java method from c++ in Android
编辑 现在,一旦你用这个做,它在下一次从C/C++调用效果很好。该 片段,它应该帮助你的是:

#include <string.h> 
#include <jni.h> 
//other imports 

jstring get_package_MainActivity_getJniString(JNIEnv* env, jobject obj){ 

    jstring jstr = (*env)->NewStringUTF(env, "MainActivity class"); 
    jclass clazz = (*env)->FindClass(env, "com/org/android/ui/activities/MainActivity"); 
    jmethodID mCurrentActivityId = (*env)->GetMethodID(env, clazz, "getCurrentActivityName", "(Ljava/lang/String;)Ljava/lang/String;"); 
    jobject result = (*env)->CallObjectMethod(env, obj, mCurrentActivityId, jstr); 

    const char* str = (*env)->GetStringUTFChars(env,(jstring) result, NULL); // should be released but what a heck, it's a tutorial :) 
    printf("%s\n", str); 

    return (*env)->NewStringUTF(env, str); 
} 
+0

我检查了他们,但事情是他们使用JNI调用C到JAVA,反之亦然,在JNI中,我们需要首先在Java中启动调用,然后我们可以从C调用到JAVA。 我想要的是从C调用JAVA而不用JAVA启动它。 – MMJ

0

我觉得你的目的,你需要使用JNI,以通过JVM参数(的JNIEnv * ENV,jobject OBJ),然后并将其作为全球/你的c/C++代码中的静态变量。将其视为您应用的初始阶段。

一旦您的c/C++端代码准备好调用java方法,您可以使用全局/静态变量来启动对java方法的调用,如代码片段andrei所提供的。一些符合:

JNIEnv* cSideEnv; // global, set using JNI call in java 
jobject cSideObj; // global, set using JNI call in java 

void get_package_MainActivity_setCsideJvm(JNIEnv* env, jobject obj){ 
    cSideEnv = env; 
    cSideObj = obj; 
} 

void myCsideCallToJava() { 
    jstring jstr = (*cSideEnv)->NewStringUTF(cSideEnv , "MainActivity class"); 
    jclass clazz = (*cSideEnv)->FindClass(env, 
     "com/org/android/ui/activities/MainActivity"); 
    jmethodID mCurrentActivityId = (*cSideEnv)->GetMethodID(cSideEnv , clazz, 
     "getCurrentActivityName", "(Ljava/lang/String;)Ljava/lang/String;"); 
    jobject result = (*cSideEnv)->CallObjectMethod(cSideEnv , cSideObj, 
     mCurrentActivityId, jstr); 
} 

void main(.....) { 
    // init - precondition for calling java is running the java side setCsideJvm 
    // which sets cSideEnv and cSideObj 
    ..... 
    // ready to call java 
    myCsideCallToJava(); 
} 

由于您使用JNI,我相信你的应用程序将您的应用程序的C/C++的一部分之前运行的Java的一部分,所以这个解决方案应该帮助你。

如果您正在使用2个进程(一个java,一个c/C++),那么这是一个完全不同的问题,可以通过IPC解决方案解决。

+0

在我的情况下,整个系统是由C/C++项目驱动的。 *所以首先将运行C++部分,它将调用Java类中的方法,然后使用AIDL调用android中的服务设计。* 需要使用哪种IPC解决方案来实现上述方案发展? – MMJ

+0

其实我是Android和NDK开发的新手。这就是我需要问这么多问题的原因:) – MMJ

+0

我对android开发没有经验,只有JNI和IPC解决方案。根据你的意见,似乎你有一个java方法的特定需求,对于纯粹的c/C++项目。IPC解决方案将要求您同时进行2个进程 - c/C++主进程和专用java进程(用于单个方法调用)。这似乎是对你的问题矫枉过正。既可以实现Java方法的c/C++版本,也可以使用c/C++ JNI内核将项目切换到java。这是我能做的最好的。 –