只是一个简单的问题:
是否可以从c / c ++调用Java函数?
参考方案
是的,可以,但是有点麻烦,并且可以以反射/非类型安全的方式工作(示例使用的C++ API比C版本更清洁)。在这种情况下,它将从C代码中创建Java VM的实例。如果首先从Java调用您的本机调用,则无需构造VM实例
#include<jni.h>
#include<stdio.h>
int main(int argc, char** argv) {
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("Hello World");
// First get the class that contains the method you need to call
jclass clazz = env->FindClass("java/lang/String");
// Get the method that you want to call
jmethodID to_lower = env->GetMethodID(clazz, "toLowerCase",
"()Ljava/lang/String;");
// Call the method on the object
jobject result = env->CallObjectMethod(jstr, to_lower);
// 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();
}
编译(在Ubuntu上):
g++ -I/usr/lib/jvm/java-6-sun/include \
-I/usr/lib/jvm/java-6-sun/include/linux \
-L/usr/lib/jvm/java-6-sun/jre/lib/i386/server/ -ljvm jnitest.cc
注意:为了实现正确的错误处理,应检查每种方法的返回代码(为方便起见,我将其忽略了)。例如。
str = env->GetStringUTFChars(jstr, NULL);
if (str == NULL) {
return; /* out of memory */
}
在Java中,执行“ ++++++++”表达式,编译器未报告任何错误并且可以正确执行? - java我用eclipse编写了这段代码,用war写过,结果为3d。public static void main(String[] args) { double a = 5d + + + + + +-+3d; System.out.println(a); } 参考方案 您的表情可以改写为(5d) + (+ + + + +-+3d) 其中第一个+是应用于两个操作数的…
Java值加变量++ - java考虑以下代码int val1 = 3; val1++; int val2 = val1++; System.out.println(val1); System.out.println(val2); Val1值= 5;Val2值= 4;为什么Val1的值是“ 5”?据我了解,应该为4,因为:在第1行,它的赋值为3,在第2行,通过val1 ++加上1,结果val…
为什么C++中的void方法可以返回void值,而在其他语言中却不能呢? - java该程序可以用C ++编译并运行,但不能使用多种不同的语言,例如Java和C#。#include <iostream> using namespace std; void foo2() { cout << "foo 2.\n"; } void foo() { return foo2(); } int main() {…
如何在JNIWrapper中将C++ Array <float,size>转换为jfloatArray? - java我想将我的C ++数组输出映射到jniFloatArray。尝试遵循以下解决方案:“ Convert float* to jfloatArray using JNI”但我无法将float *指向数组对象。假设我在C ++数组输出对象中的输出是:输出= {1.0f,2.0f,3.0f};我真正想要的是将输出(数组)转换或映射到JniWrapper中的jfloa…
Hibernate通过非主键获取实体并更新它+ Spring MVC - java当我使用其ID检索对象并更改其属性并更新它时,一切正常,但是当我使用其名称+版本获取对象并更新它们时,所有更改都不会保存在数据库中。您能不能让别人让我知道是什么问题?//通过id获取public PdfDocument get(Long id) { return (PdfDocument) session().get(PdfDocument.class, i…