步骤:

1. 创建虚拟机

2. 获得class

3. 实例化对象:获得构造方法(方法名为“<init>”),构造参数,调用方法

4. 调用方法:又分为获得方法,构造方法,调用方法

操作方法:

1. 编译:javac Hello.java

2. javap -p -s Hello.class:查看Signature

3. gcc -I/usr/lib/jvm/java-1.8.0-openjdk-amd64/include/ -I/usr/lib/jvm/java-1.8.0-openjdk-amd64/include/linux/ -o caller caller.c -L /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server -ljvm

4. 执行:LD_LIBRARY_PATH=/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server ./caller

举例:

(1)call_static_method

 #include <stdio.h>
#include <jni.h> JNIEnv* create_vm(JavaVM** jvm, JNIEnv** env)
{
JavaVMInitArgs args;
JavaVMOption options[];
args.version = JNI_VERSION_1_6;
args.nOptions = ;
options[].optionString = "-Djava.class.path=./";
args.options = options;
args.ignoreUnrecognized = JNI_FALSE;
return JNI_CreateJavaVM(jvm, (void **)env, &args);
} int main(int argc, char **argv)
{
JavaVM* jvm;
JNIEnv* env; jclass cls;
int ret = ; jmethodID mid; /* 1. create java virtual machine */
if(create_vm(&jvm, &env))
{
printf("can not create jvm\n");
return -;
} /* 2. get class */
cls = (*env)->FindClass(env, "Hello");
if(cls == NULL)
{
printf("can not find hello class\n");
ret = -;
goto destory;
} /* 3. create object */ /* 4. call method
* 4.1 get method
* 4.2 create parameter
* 4.3 call method
*/ mid = (*env)->GetStaticMethodID(env, cls, "main", "([Ljava/lang/String;)V");
if(mid == NULL)
{
ret = -;
printf("can not get method\n");
goto destory;
} (*env)->CallStaticVoidMethod(env, cls, mid, NULL); destory:
(*jvm)->DestroyJavaVM(jvm); return ret;
}

(2)call_non_static_method

 #include <stdio.h>
#include <jni.h> JNIEnv* create_vm(JavaVM** jvm, JNIEnv** env)
{
JavaVMInitArgs args;
JavaVMOption options[];
args.version = JNI_VERSION_1_6;
args.nOptions = ;
options[].optionString = "-Djava.class.path=./";
args.options = options;
args.ignoreUnrecognized = JNI_FALSE;
return JNI_CreateJavaVM(jvm, (void **)env, &args);
} int main(int argc, char **argv)
{
JavaVM* jvm;
JNIEnv* env; jclass cls;
int ret = ; jmethodID mid;
jmethodID cid; jobject jobj;
jstring jstr; int r; /* 1. create java virtual machine */
if(create_vm(&jvm, &env))
{
printf("can not create jvm\n");
return -;
} /* 2. get class */
cls = (*env)->FindClass(env, "Hello");
if(cls == NULL)
{
printf("can not find hello class\n");
ret = -;
goto destory;
} /* 3. create object
*
*/ cid = (*env)->GetMethodID(env, cls, "<init>", "()V");
if(cid == NULL)
{
printf("can not get construct method\n");
ret = -;
goto destory;
} jobj = (*env)->NewObject(env, cls, cid);
if(jobj == NULL)
{
printf("can not create object\n");
ret = -;
goto destory;
} /* 4. call method
* 4.1 get method
* 4.2 create parameter
* 4.3 call method
*/ mid = (*env)->GetMethodID(env, cls, "sayhello_to", "(Ljava/lang/String;)I");
if(mid == NULL)
{
ret = -;
printf("can not get method\n");
goto destory;
} jstr = (*env)->NewStringUTF(env, "287787472@qq.com"); r = (*env)->CallIntMethod(env, jobj, mid, jstr);
printf("ret = %d\n", r); destory:
(*jvm)->DestroyJavaVM(jvm); return ret;
}

JNI——C调用JAVA的更多相关文章

  1. C通过JNI反向调用JAVA程序方法

    JNI反向调用JAVA程序 引述:上文讲过java线程---OS线程的关系,然后C怎样反向调用JAVA程序方法是我们这篇讲的重点 1.ThreadTest中添加run()方法 2.编译ThreadTe ...

  2. cocos2d-x中使用JNI的调用JAVA方法

    用cocos2d-x公布Android项目时.都应该知道要用JAVA与C/C++进行交互时会涉及到JNI的操作(Java Native Interface).JNI是JAVA的一个通用接口.旨在本地化 ...

  3. jni中调用java方法获取当前apk的签名文件md5值

    相应的java方法: void getsign(Context context) throws Exception { PackageInfo localPackageInfo = context.g ...

  4. cocos2d 中使用jni C++ 调用 Java 方法

    1.简单数据类型样例 如果我们Java中有这么一个open的静态方法,它没有參数,有一个int的返回值.怎么在C++中调用它呢? package cb.CbCCBLE; public class Cb ...

  5. JNI c++ 调用 java

    ----------------------------------------------c++--------------------------------------- #include &q ...

  6. Android JNI之调用JAVA方法的返回类型签名

    从http://blog.csdn.net/lonelyroamer/article/details/7932787截取的 如何签名: 下面看看Sign签名如何写,来表示要取得的属性或方法的类型. 1 ...

  7. NativeCode中通过JNI反射调用Java层的代码,以获取IMEI为例

    简单说,就是在NativeCode中做一些正常情况下可以在Java code中做的事儿,比如获取IMEI. 这种做法会使得静态分析Java层代码的方法失效. JNIEXPORT jstring JNI ...

  8. C++ 调用 java jni.h 的使用

    JNI c++ 调用 java ----------------------------------------------c++----------------------------------- ...

  9. HAL中通过JNI调用java方法【转】

    转载请注明本文出处:http://www.cnblogs.com/xl19862005 作者:Xandy 由于工作的需要,最近一直在研究HAL.JNI.Java方法之间互调的问题,并做了如下一些记录和 ...

随机推荐

  1. 【搞机】9.7英寸iPad Pro 上手开箱(图文)

    前言 话说,去年就一直想买个iPad ,可是苦于iPad air 2 出的太早,立即就要更新了,就没有买. 今年出了9.7英寸的iPad Pro .看到添加了这么多新特性.就按耐不住心情预订了~ 还刻 ...

  2. 使用Android注解来改善代码

    昨晚看到一篇好文章.然后是英文的.所以决定翻译分享给大家.这是原文链接:http://www.michaelevans.org/blog/2015/07/14/improving-your-code- ...

  3. JavaScript闭包其一:闭包概论 函数式编程中一些基本定义

    http://www.nowamagic.net/librarys/veda/detail/1707前面介绍了作用域链和变量对象,现在再讲闭包就容易理解了.闭包其实大家都已经谈烂了.尽管如此,这里还是 ...

  4. MQTT 测试工具介绍

    eclipse paho 下载地址为: https://repo.eclipse.org/content/repositories/paho-releases/org/eclipse/paho/org ...

  5. hdu 5316 Magician 线段树

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=5316 Magician Time Limit: 18000/9000 MS (Java/Others)  ...

  6. opencv中的SVM图像分类(二)

    opencv中的SVM图像分类(二) 标签: svm图像 2015-07-30 08:45 8296人阅读 评论(35) 收藏 举报  分类: [opencv应用](5)  版权声明:本文为博主原创文 ...

  7. 一套Tomcat处理多个域名请求 - Virtual Host

    最近和Tomcat较上劲了... 作为Tomcat的系列之一,来尝试下如何用一套Tomcat来处理多个域名请求. 场景:基于成本考虑,多个department共用一台服务器,然后该服务器上就一套Tom ...

  8. 分布式开源调度框架TBSchedule原理与应用

    主要内容: 第一部分 TBSchedule基本概念及原理 1. 概念介绍 2. 工作原理 3. 源代码分析 4. 与其它开源调度框架对照 第二部分 TBSchedule分布式调度演示样例 1. TBS ...

  9. 【MatConvNet】配置GPU

    参照大神的方法:http://www.th7.cn/system/win/201603/155182.shtml 第一步:需要安装cuda.VS2013:cuda默认路径,注意cuda版本和GPU要匹 ...

  10. 目标检测之hough forest---霍夫森林(Hough Forest)目标检测算法

     Hough Forest目标检测一种比较时兴的目标检测算法,Juergen Gall在2009的CVPR上提出. Hough Forest听上去像hough变换+Random Forest的结合体, ...