c++和java的调用_JNI编程 —— 让C++和Java相互调用(2)

cout <

return1.2;

}

else

{

env->ReleaseStringUTFChars(name, pname);

cout <

return2.1;

}

}

JNIEXPORT jobject JNICALL Java_com_chnic_service_Business_getOrder(JNIEnv* env,

jobject obj,

jstring name,

jint amount)

{

jclass order_class = env->FindClass("com/chnic/bean/Order");

jobject order = getInstance(env, order_class);

jmethodID setName_method = env->GetMethodID(order_class, "setName","(Ljava/lang/String;)V");

env->CallVoidMethod(order, setName_method, name);

jmethodID setAmount_method = env->GetMethodID(order_class, "setAmount","(I)V");

env->CallVoidMethod(order, setAmount_method, amount);

returnorder;

}

JNIEXPORT jobject JNICALL Java_com_chnic_service_Business_getRamdomOrder(JNIEnv* env,

jobject obj)

{

jclass business_class = env->GetObjectClass(obj);

jobject business_obj = getInstance(env, business_class);

jmethodID notification_method = env->GetMethodID(business_class, "notification","()V");

env->CallVoidMethod(obj, notification_method);

jclass order_class = env->FindClass("com/chnic/bean/Order");

jobject order = getInstance(env, order_class);

jfieldID amount_field = env->GetFieldID(order_class, "amount","I");

jint amount = env->GetIntField(order, amount_field);

cout <

returnorder;

}

JNIEXPORT voidJNICALL Java_com_chnic_service_Business_analyzeOrder (JNIEnv* env,

jclass cls,

jobject obj)

{

jclass order_class = env->GetObjectClass(obj);

jmethodID getName_method = env->GetMethodID(order_class, "getName","()Ljava/lang/String;");

jstring name_str = static_cast(env->CallObjectMethod(obj, getName_method));

constchar* pname = env->GetStringUTFChars(name_str, NULL);

cout <

jmethodID notification_method_static = env->GetStaticMethodID(cls, "notificationByStatic","()V");

env->CallStaticVoidMethod(cls, notification_method_static);

}

jobject getInstance(JNIEnv* env, jclass obj_class)

{

jmethodID construction_id = env->GetMethodID(obj_class, "","()V");

jobject obj = env->NewObject(obj_class, construction_id);

returnobj;

}

可以看到,在我Java中的四个本地方法在这里全部被实现,接下来针对这四个方法来解释下,一些JNI相关的API的使用方法。先从第一个方法讲起吧:

1.getPrice(String name)

这个方法是从foreground传递一个类型为string的参数到backend,然后backend判断返回相应的价格。在cpp的代码中, 我们用GetStringUTFChars这个方法来把传来的jstring变成一个UTF-8编码的char型字符串。因为jstring的实际类型是 jobject,所以无法直接比较。

GetStringUTFChars方法包含两个参数,第一参数是你要处理的jstring对象,第二个参数是否需要在内存中生成一个副本对象。将 jstring转换成为了一个const char*了之后,我们用string.h中带strcmp函数来比较这两个字符串,如果传来的字符串是“Apple”的话我们返回1.2。反之返回 2.1。在这里还要多说一下ReleaseStringUTFChars这个函数,这个函数从字面上不难理解,就是释放内存用的。有点像cpp里的析构函 数,只不过Sun帮我们已经封装好了。由于在JVM中有GC这个东东,所以多数java coder并没有写析构的习惯,不过在JNI里是必须的了,否则容易造成内存泄露。我们在这里在release之前和之后分别打出这个字符串来看一下效果。

粗略的解释完一些API之后,我们编写测试代码。

Java代码

Business b =newBusiness();

System.out.println(b.getPrice("Apple"));

运行这段测试代码,控制台上打出

Before release: Apple

After release:

(牛蹄印章)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值