参考了http://www.iteye.com/topic/460152
几乎是照着例子做的,遇到以下困难
1
error LNK2001: unresolved external symbol __imp__JNI_CreateJavaVM@12
这是因为没有连接到 JVM.lib 库导致的. 一开始使用工具DEV C++,但它在windows 下无完连接.lib 库,改用VC++ 解决了问题(工程-设置-连接)。
2 JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); 创建不了。这里和之前Java使用DLL 不同,jvm.dll 并不单放在 windows/system32 下面就可以解决,它有依赖,需设置环境变量 paht jdk1.6.0_12\jre\bin\server.
3 java类存放位置放在 options[0].optionString = "-Djava.class.path=."; 指定的地方.这里是指定为当前项目目录.
相关代码:
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <jni.h>
#ifdef _WIN32
#define PATH_SEPARATOR ';'
#else
#define PATH_SEPARATOR ':'
#endif
int main()
{
JavaVMOption options[1];
JNIEnv *env;
JavaVM *jvm;
JavaVMInitArgs vm_args;
long status;
jclass cls;
jmethodID mid;
jint square;
//设置Java类的路径
options[0].optionString = "-Djava.class.path=.";
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 1;
vm_args.options = options;
vm_args.ignoreUnrecognized = JNI_TRUE;
status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
if (status != JNI_ERR)
{
cls = env->FindClass("com/isw2/jni/CJava");
if(cls !=0)
{
mid = env->GetStaticMethodID( cls, "add", "(II)I");
if(mid !=0)
{
square = env->CallStaticIntMethod( cls, mid, 5,5);
std::cout << square << std::endl;
printf("square : %d",square);
}
}
jvm->DestroyJavaVM();
return 0;
}
else{
return -1;}
}
package com.isw2.jni;
public class CJava {
public static String getstring(String str) {
return str + "----String com.isw2.jni.CJava.getstring(String str) ";
}
public static int add(int a, int b) {
return a + b;
}
}
分享到:
相关推荐
最近项目中需要使用JNI,所以研究了一下,其中遇到过不少问题,总结一下,让遇到同样问题的人...在C/C++中调用Java的方法一般分为五个步骤:初始化虚拟机、获取类、获取类的方法、创建类对象、调用方法和退出虚拟机。
总结,C++库封装JNI接口实现Java调用C++涉及的主要步骤包括:声明Java中的本地方法,生成JNI头文件,编写C++实现,编译成库,最后在Java中加载并调用。这个过程需要理解Java和C++之间的数据类型转换,以及如何在两种...
- **本地方法接口**:JNI定义了一组C/C++函数,这些函数在Java虚拟机(JVM)中提供服务,如创建和操作Java对象,调用Java方法等。 - **头文件和库**:开发JNI程序需要包含`jni.h`头文件,这是Java SDK的一部分。...
本文将详细讲解在Android Studio 3.0中如何实现C++调用Java以及Java调用C++的过程。 首先,我们需要在Android Studio项目中配置NDK(Native Development Kit),它是Android用于编写和编译C/C++代码的工具集。在...
这个"linux-java调用c语言编译的so动态库-jni例子-简单计算器"是一个典型的示例,展示了如何利用JNI来创建一个Java应用程序,该程序能够调用C编写的动态链接库(.so文件)进行计算操作。 JNI是Java平台的一部分,它...
假如有一个现有的 .dll/.so 文件,假如使用 JNI 技术调用,我们首先需要另外使用 C 语言写一个 .dll/.so 共享库,使用 SUN 规定的数据结构替换 C 语言的数据结构,调用已有的 ? dll/so 中公布的函数。 然后再在 Java...
在Android开发中,有时我们需要利用Java Native Interface (JNI) 来调用C/C++的库,以实现一些高性能或者特定平台的功能,例如本案例中的串口Socket通讯和USB驱动。JNI是Java平台标准的一部分,它允许Java代码和其他...
本文将详细探讨"android aes-jni Java和C互加解密"这个主题,它涉及到Android平台上的JNI(Java Native Interface)技术以及AES加密在Java和C语言之间的实现。 首先,AES是一种块密码,它对128位的数据进行加密,...
在本例中,JNI将作为Java与C/C++编译的GMSSL库之间的桥梁,使得Java应用程序能够直接调用GMSSL中的原生函数。 1. **SM2算法**:这是一种非对称公钥加密算法,基于椭圆曲线密码学(ECC)。SM2不仅提供了公钥加密功能,...
通过这个项目,你可以学习到如何在JNI中创建和管理多线程,以及如何在这些线程中安全地调用Java对象。 总结,本项目展示了如何在Android的JNI环境中利用多线程调用Java代码,这对于理解和实践JNI、线程管理和跨语言...
首先,Jnidemo-master项目是一个关于JNI的实例教程,主要展示了如何通过JNI在Java中调用C/C++库。项目名称中的"3.17.final.ok"可能表示这是一个经过多次迭代、最终稳定版本的示例,适合初学者和有经验的开发者进行...
3. **本地方法实现**:在C/C++代码中,开发者需要实现JNI头文件中声明的函数,这些函数会直接或间接地调用Java的方法,完成特定的功能。 4. **数据类型转换**:JNI提供了一套数据类型映射,如`jint`对应Java的`int`...
"C语言调用java语言方法"是一个典型的跨语言通信场景,主要应用于Android平台上的JNI(Java Native Interface)开发。JNI允许Java代码和其他语言(如C/C++)进行无缝交互,提升性能或者利用已有的库资源。 首先,...
本示例将讲解如何在Android Studio 2.3.3版本下,通过C语言调用Java方法。 首先,理解JNI的基本结构。在Java端,我们需要定义一个本地方法,即使用`native`关键字声明的方法。例如: ```java public class ...
在本主题中,我们将深入探讨如何在Android应用中实现C语言调用Java方法。 首先,我们需要理解JNI的基本结构。在Android项目中,JNI相关的代码通常被放在`src/main/jni`目录下,这里的源代码文件通常以`.c`或`.cpp`...
JNI 在 Java 中提供了调用 C/C++ 代码的能力,而我们可以通过扩展 JNI 来调用其他语言,如 Golang。 在 Go 1.5 版本之后,Go 语言引入了 cgo,这是一个工具,它允许 Go 代码调用 C 代码,并且可以生成可链接到其他 ...
- 通过`JNIEnv`指针,C++可以查找并调用Java对象的方法,访问字段,甚至创建新的Java对象。 8. **构建流程**: - 使用NDK(Native Development Kit)编译C/C++代码,生成.so文件。 - 将.so文件放置在项目的`jni...
在本实例中,我们将深入探讨如何使用纯C语言通过JNI调用Java对象的方法。这个例子特别适合那些需要利用C/C++的高效性能,同时又需要与Java应用程序集成的开发者。 首先,我们需要理解JNI的基本概念。JNI提供了一套...
它们允许Java应用程序调用C、C++等本地库,从而扩展Java的功能,解决性能瓶颈或利用已有的非Java库。本项目"jni-jna-web.zip"是一个基于Spring Boot 2.3.0的Web工程,深入实践了JNI和JNA的应用。 首先,让我们来...