La primera pregunta es, ¿realmente necesita portar esos archivos? :-)
Puede incluir el código fuente de Java en un proyecto Mono para Android; simplemente establezca la acción Build en AndroidJavaSource
y la fuente se compilará en el .apk resultante. Esto también se puede hacer con los archivos .jar
.
Luego viene la pregunta de invoking the Java code from C#.
En el caso de IntentIntegration.java
y IntentResult.java
, que puede ser suficiente, ya que esos tipos no son compatibles con la herencia (son final
). Por supuesto, el uso de JNIEnv para invocar métodos en ellos serían un PITA, pero se puede hacer:
// Untested code, provided for demo purposes:
// Handle of the Java class we're invoking
IntPtr IntentResult =
JNIEnv.FindClass("com/google/zxing/integration/android/IntentIntegrator");
// Handle of the method to invoke
IntPtr IntentResult_initiateScan =
JNIEnv.GetMethodID(IntentResult, "initiateScan",
"(Landroid/app/Activity;)Landroid/app/AlertDialog;");
// method signature can be obtained from `javap -s`
// Invoke the method; return value is an AlertDialog instance
IntPtr rAlertDialog = JNIEnv.CallStaticObjectMethod (
IntentResult, IntentResult_initiateScan, new JValue (someActivity));
// ...and construct a nice managed wrapper over the Java instance.
AlertDialog alertDialog = new AlertDialog (rAlertDialog);
Por otra parte, los IntentIntegrator
documentos mencionan que la actividad proporcionada debe reemplazar el método Activity.OnActivityResult.
Dicho todo esto, portar IntentIntegrator.java
no debería ser que difícil, ya que la mayor parte es un envoltorio sobre Activity.StartActivityForResult con la intención y la construcción apropiada de un AlertDialog
(que puede o no puede necesitar).
si está seguro de que esto funciona, hágamelo saber. Cambié de MonoDroid al verdadero SDK de Android (excepto que utilizo el estudio IntelliJ de JetBrains) ya que esto era imprescindible para que ZX funcione. – thames
jonp, no entendí el parámetro de firma del método GetMethodID. No he podido ejecutar javap en intentintegrator.java, ya que sigue quejándose de que no puede encontrar la clase. Por favor ayuda. ¿Podría explicar el componente de la firma? –
@CF_Maintainer: la manera más fácil es usar 'javap -s -classpath filename.jar package.of.some.Type'. Sin embargo, si tienes un archivo '.java' y no un archivo' .jar', te sugiero compilar en un archivo '.class' y usar' javap'; de lo contrario, debe deducir manualmente la firma JNI: http://download.oracle.com/javase/1.5.0/docs/guide/jni/spec/types.html#wp16432 y http://www.rgagnon.com /javadetails/java-0286.html – jonp