`
zhouxianglh
  • 浏览: 268148 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JNI学习-C 调用Java

    博客分类:
  • J2SE
阅读更多

参考了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;
	}
}
 
分享到:
评论
3 楼 S090071586 2012-06-13  
你好,我在用c调java的时候出现了error LNK2001: unresolved external symbol __imp__JNI_CreateJavaVM@12 ,我使用的就是vc++6.0,环境变量D:\Program Files\Java\jdk1.6.0_18\jre\bin\client,但还是有error LNK2001: unresolved external symbol __imp__JNI_CreateJavaVM@12这个问题,能帮我解决一下嘛?
2 楼 zhouxianglh 2010-07-19  
genius 写道

   status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);这里,就是找不到jvm.

2 JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);  创建不了。这里和之前Java使用DLL 不同,jvm.dll 并不单放在 windows/system32 下面就可以解决,它有依赖,需设置环境变量 paht  jdk1.6.0_12\jre\bin\server.
1 楼 genius 2010-07-17  
大哥,小弟在netbean 里面用C 调用java ,做你这个例子,到
   status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);这里,就是找不到jvm.大哥有空,上线帮我解决一下吧。谢谢啊 . QQ: 464626736 MSN: geniues@126.com

相关推荐

    JNI------C语言调用Java

    最近项目中需要使用JNI,所以研究了一下,其中遇到过不少问题,总结一下,让遇到同样问题的人...在C/C++中调用Java的方法一般分为五个步骤:初始化虚拟机、获取类、获取类的方法、创建类对象、调用方法和退出虚拟机。

    C++库封装JNI接口-实现java调用c++

    总结,C++库封装JNI接口实现Java调用C++涉及的主要步骤包括:声明Java中的本地方法,生成JNI头文件,编写C++实现,编译成库,最后在Java中加载并调用。这个过程需要理解Java和C++之间的数据类型转换,以及如何在两种...

    JNI 学习-Java 调用C

    - **本地方法接口**:JNI定义了一组C/C++函数,这些函数在Java虚拟机(JVM)中提供服务,如创建和操作Java对象,调用Java方法等。 - **头文件和库**:开发JNI程序需要包含`jni.h`头文件,这是Java SDK的一部分。...

    Android Studio3.0开发JNI流程------C++调用Java以及Java调用C++,C++/Java互相调用

    本文将详细讲解在Android Studio 3.0中如何实现C++调用Java以及Java调用C++的过程。 首先,我们需要在Android Studio项目中配置NDK(Native Development Kit),它是Android用于编写和编译C/C++代码的工具集。在...

    linux-java调用c语言编译的so动态库-jni例子-简单计算器

    这个"linux-java调用c语言编译的so动态库-jni例子-简单计算器"是一个典型的示例,展示了如何利用JNI来创建一个Java应用程序,该程序能够调用C编写的动态链接库(.so文件)进行计算操作。 JNI是Java平台的一部分,它...

    JNI--java调用不同平台的动态链接库,dll,so,完美,全教程

    假如有一个现有的 .dll/.so 文件,假如使用 JNI 技术调用,我们首先需要另外使用 C 语言写一个 .dll/.so 共享库,使用 SUN 规定的数据结构替换 C 语言的数据结构,调用已有的 ? dll/so 中公布的函数。 然后再在 Java...

    GMSSL的java调用(JNI库和调用实例).zip

    在本例中,JNI将作为Java与C/C++编译的GMSSL库之间的桥梁,使得Java应用程序能够直接调用GMSSL中的原生函数。 1. **SM2算法**:这是一种非对称公钥加密算法,基于椭圆曲线密码学(ECC)。SM2不仅提供了公钥加密功能,...

    安卓串口Socket通讯USB驱动jni相关-Android调用JNI的简单实例附详细步骤.zip

    在Android开发中,有时我们需要利用Java Native Interface (JNI) 来调用C/C++的库,以实现一些高性能或者特定平台的功能,例如本案例中的串口Socket通讯和USB驱动。JNI是Java平台标准的一部分,它允许Java代码和其他...

    aes-jni-java和c互加解密

    本文将详细探讨"android aes-jni Java和C互加解密"这个主题,它涉及到Android平台上的JNI(Java Native Interface)技术以及AES加密在Java和C语言之间的实现。 首先,AES是一种块密码,它对128位的数据进行加密,...

    jni中用多线程调用java代码

    通过这个项目,你可以学习到如何在JNI中创建和管理多线程,以及如何在这些线程中安全地调用Java对象。 总结,本项目展示了如何在Android的JNI环境中利用多线程调用Java代码,这对于理解和实践JNI、线程管理和跨语言...

    Jnidemo-master.3.17.final.ok.rar

    首先,Jnidemo-master项目是一个关于JNI的实例教程,主要展示了如何通过JNI在Java中调用C/C++库。项目名称中的"3.17.final.ok"可能表示这是一个经过多次迭代、最终稳定版本的示例,适合初学者和有经验的开发者进行...

    Jnidemo-master.3.17.final.ok(20200813.final.ok).zip

    3. **本地方法实现**:在C/C++代码中,开发者需要实现JNI头文件中声明的函数,这些函数会直接或间接地调用Java的方法,完成特定的功能。 4. **数据类型转换**:JNI提供了一套数据类型映射,如`jint`对应Java的`int`...

    C语言调用java语言方法

    "C语言调用java语言方法"是一个典型的跨语言通信场景,主要应用于Android平台上的JNI(Java Native Interface)开发。JNI允许Java代码和其他语言(如C/C++)进行无缝交互,提升性能或者利用已有的库资源。 首先,...

    jni C调用java示例

    本示例将讲解如何在Android Studio 2.3.3版本下,通过C语言调用Java方法。 首先,理解JNI的基本结构。在Java端,我们需要定义一个本地方法,即使用`native`关键字声明的方法。例如: ```java public class ...

    android JNI C 调用Java

    在本主题中,我们将深入探讨如何在Android应用中实现C语言调用Java方法。 首先,我们需要理解JNI的基本结构。在Android项目中,JNI相关的代码通常被放在`src/main/jni`目录下,这里的源代码文件通常以`.c`或`.cpp`...

    Jni-Golang:java调用golang(通过Go1.5共享库)

    JNI 在 Java 中提供了调用 C/C++ 代码的能力,而我们可以通过扩展 JNI 来调用其他语言,如 Golang。 在 Go 1.5 版本之后,Go 语言引入了 cgo,这是一个工具,它允许 Go 代码调用 C 代码,并且可以生成可链接到其他 ...

    Android-JNI完整工程,实现c++调用java和java调用c++

    - 通过`JNIEnv`指针,C++可以查找并调用Java对象的方法,访问字段,甚至创建新的Java对象。 8. **构建流程**: - 使用NDK(Native Development Kit)编译C/C++代码,生成.so文件。 - 将.so文件放置在项目的`jni...

    JNI中C调用Java方法的实例

    在本实例中,我们将深入探讨如何使用纯C语言通过JNI调用Java对象的方法。这个例子特别适合那些需要利用C/C++的高效性能,同时又需要与Java应用程序集成的开发者。 首先,我们需要理解JNI的基本概念。JNI提供了一套...

    jni-jna-web.zip

    它们允许Java应用程序调用C、C++等本地库,从而扩展Java的功能,解决性能瓶颈或利用已有的非Java库。本项目"jni-jna-web.zip"是一个基于Spring Boot 2.3.0的Web工程,深入实践了JNI和JNA的应用。 首先,让我们来...

Global site tag (gtag.js) - Google Analytics