J'essaie d'obtenir un simple appel de méthode Java à partir de C ++ tandis que Java appelle la méthode native. Voici le code Java:
public class MainActivity extends Activity {
private static String LIB_NAME = "name";
static {
System.loadLibrary(LIB_NAME);
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tv = (TextView) findViewById(R.id.textview);
tv.setText(this.getJniString());
}
public void messageMe(String text) {
System.out.println(text);
}
public native String getJniString();
}
J'essaie d'appeler une messageMe
méthode à partir du code natif dans le processus d' getJniString*
appel de méthode de Java à natif.
native.cpp:
#include <string.h>
#include <stdio.h>
#include <jni.h>
jstring Java_the_package_MainActivity_getJniString( JNIEnv* env, jobject obj, jint depth ){
// JavaVM *vm;
// JNIEnv *env;
// JavaVMInitArgs vm_args;
// vm_args.version = JNI_VERSION_1_2;
// vm_args.nOptions = 0;
// vm_args.ignoreUnrecognized = 1;
//
// // Construct a VM
// jint res = JNI_CreateJavaVM(&vm, (void **)&env, &vm_args);
// Construct a String
jstring jstr = env->NewStringUTF("This string comes from JNI");
// First get the class that contains the method you need to call
jclass clazz = env->FindClass("the/package/MainActivity");
// Get the method that you want to call
jmethodID messageMe = env->GetMethodID(clazz, "messageMe", "(Ljava/lang/String;)V");
// Call the method on the object
jobject result = env->CallObjectMethod(jstr, messageMe);
// Get a C-style string
const char* str = env->GetStringUTFChars((jstring) result, NULL);
printf("%s\n", str);
// Clean up
env->ReleaseStringUTFChars(jstr, str);
// // Shutdown the VM.
// vm->DestroyJavaVM();
return env->NewStringUTF("Hello from JNI!");
}
Après que l'application de compilation propre s'arrête avec le message suivant:
ERROR/AndroidRuntime(742): FATAL EXCEPTION: main
java.lang.NoSuchMethodError: messageMe
at *.android.t3d.MainActivity.getJniString(Native Method)
at *.android.t3d.MainActivity.onCreate(MainActivity.java:22)
Apparemment, cela signifie que le nom de la méthode est faux, mais cela me semble correct.
java
c++
android
java-native-interface
android-ndk
Denys S.
la source
la source
getJniString
méthode en java ou en c. Assurez-vous de bien lier le code c à java probablement par importation système (srsly ne me souviens pas de tout cela maintenant: P)onCreate
méthode de Java qui appelle votre C. natifRéponses:
S'il s'agit d'une méthode objet, vous devez transmettre l'objet à
CallObjectMethod
:Ce que vous faisiez était l'équivalent de
jstr.messageMe()
.Puisque votre est une méthode void, vous devez appeler:
env->CallVoidMethod(obj, messageMe, jstr);
Si vous souhaitez retourner un résultat, vous devez changer votre signature JNI (cela
()V
signifie une méthode devoid
type de retour) ainsi que le type de retour dans votre code Java.la source
Solution publiée par Denys S. dans le post de question:
Je l'ai assez gâché avec la conversion de C en C ++ (essentiellement
env
des éléments variables), mais je l'ai fait fonctionner avec le code suivant pour C ++:Et le code suivant pour les méthodes java:
la source
native
méthodes doivent-elles être statiques?