JNI的问题,高分求解~!急,在线等 本帖最后由 sqz10200 于 2009-08-18 11:41:04 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 厂家的SDK就是他的开发工具包,你就按照厂家的帮助和提供的API做就是了,这没什么吧!如果还要调用本地dll的话,感觉就不会有跨平台的优势了。这个业务太具体了,希望楼主多跟厂家沟通一下。如果是具体技术问题,大家还是可以帮助你的。另外,帮你顶一下吧~~ OCX是一种COM组件,你基本可以认为他是基于C++写的。Java的JNI支持调用C/C++首先要注册ocx,否则就是C++也调用不成功。另外建议你用C先调用ocx,留好接口,然后给Java调用,更简单。这个时候,做后台的最好是C#。它调用ocx是极其轻松的事情。 哦这样啊厂家那边说没有做过java的每有材料可以给我这让我很郁闷阿不知道怎么弄这方面有弄过的马,视频采集卡都行啊要是有案例给我用用酒好了谢谢大家了 一、JNI 解决方案可以分成 Java 编程任务和 C/C++ 编程任务,由不同的程序员完成每项任务二、工具与组件1、Java 编译器:随 SDK 一起提供的 javac.exe。2、Java 虚拟机(JVM):随 SDK 一起提供的 java.exe。3、本机方法 C 文件生成器:随 SDK 一起提供的 javah.exe。4、定义 JNI 的库文件和本机头文件。jni.h C 头文件、jvm.lib 和 jvm.dll 或 jvm.so 文件,这些文件都是随 SDK 一起提供的5、能够创建共享库的 C 和 C++ 编译器。最常见的两个 C 编译器是用于 Windows 的 Visual C++ 和用于基于 UNIX 系统的 cc三、Java 代码调用 C/C++ 的六个步骤1.编写 Java 代码。2.编译 Java 代码。3.创建 C/C++ 头文件。4.编写 C/C++ 代码。5.创建共享库文件。6.运行 Java 程序。具体Demo可以参考:www.javaeye.com/topic/304594 这个应该是正解, OCX不能直接JNI, 需要再封装一次, 跟Java通信 楼主,可以想办法把java代码转换成c#,然后调用ocx组件,你看如何? 没想过感觉更麻烦,因为后台就是Java 你不会C/C++,那么这个程序怎么完成都是问题,最后一定会涉及c c++编程、编译……即使有人能帮你,他也没有测试环境,没有你的那个摄像机,程序到底成功没谁也不知道 Java 代码调用 C/C++ 的六个步骤1.编写 Java 代码。public class TestPlayer { static { System.loadLibrary("TestSDK"); System.loadLibrary("TestPlayer");} public native boolean ServerCapJPEG(String sername,String url,int channel,String username,String password,int quality,String wserport);}2.编译 Java 代码。不用我教了吧……3.创建 C/C++ 头文件。javah TestPlayer生成的文件如下:/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class TestPlayer */#ifndef _Included_TestPlayer#define _Included_TestPlayer#ifdef __cplusplusextern "C" {#endif/* * Class: TestPlayer * Method: ServerCapJPEG * Signature: (Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;ILjava/lang/String;)Z */JNIEXPORT jboolean JNICALL Java_TestPlayer_ServerCapJPEG (JNIEnv *, jobject, jstring, jstring, jint, jstring, jstring, jint, jstring);#ifdef __cplusplus}#endif#endif4.编写 C/C++ 代码。在你vs里面建立一个项目TestPlayer, 项目类型为Win32 Dynamic-Link Library。点击OK。选择A simple DLL project,点击Finish…………………………5.创建共享库文件。6.运行 Java 程序。 完全按照http://www.javaeye.com/topic/304594一步步来的,我这里没有测试环境,只能你自己测试了~,你看服务器已经安装过这个摄像头的驱动了,看看他里面的SDK的dll的名称叫什么,然后修改下上面的TestSDK就可以了,把你生成的TestPlayer放到java class的地方,运行下测试看看了 看这里http://ztc.javaeye.com/blog/133977 这个我懂问题是别人提供了DLL我怎么用?确实不好做啊好苯阿 我 首先一点:你现在要想用java直接点SDK里的dll是不可能的,因为现有的dll不是按照jni方式做的。关于jni和dll做成,这个已经说得比较清楚了。我补充一下: 1,写java,把需要调c/c++的方法写成vnative 2。javah声称c/c++头文件 3,VC创建链接库工程,把2的头文件整到工程里面 4,实现2的头文件定义的方法 5,在4的方法里面调用SDK中的dll(这个要求你会c/c++) 6,打dll 7, System.loadLibrary("dllName");--这里的dllName是你自己用VC做的那个,不是厂家给你的dll名,这个一定要想明白了 那就是说厂家提供的OCX这部分对我来说是没有用的是吗 ?C# 的话是不是可以直接用这个OCX 阿 jni的我们自己写的那个java文件生成的dll就是一座桥,我在前面的例子中已经给你写了System.loadLibrary("TestSDK"); System.loadLibrary("TestPlayer");,这个地方是直接加载2个dll,一个是你自己写的将要生成的dll,一个就是sdk的dll,qingkangxu 童鞋说的第5步我不敢轻易说错,只敢这么说,如果你系统已经加载过了这个dll就不用再加载了,直接调用接口就可以了,就比如window的 MessageBox()我还要用c++的方法加载下系统的dll,然后在调用这个方法?系统已经加载过了,直接调用接口就可以了,就好像java的一个类已经有实例a了,直接a.get()就搞定了,就不用在new了,我的意思,你的明白? 你创建dll(jni的)的时候最好找个c++的帮你,这里可能会出错的,出了错也很难搞的,java到c/c++是要类型转换的,网上有类型转换表,你找找看了,这里你是需要包含2个头文件,一个是他们的sdk的头文件(***SDK.H),一个是你自己javah的头文件(****testplayer.h)。完成了以上内容,剩下的就是要你去测试了 我明白了怎么还需要他们的SDK的头文件阿?我现在已经动手开始做了,多亏你帮忙了zhuyx808非常感谢阿~!! 你不导入他们的SDK的头文件,你怎么调用他们的SDK?头文件就相当于声明,只有声明过才可以引用,否则你编译就会出错,这个就相当于java的import 哦这样啊全都明白了谢谢 zhuyx808 得要依靠DLL中间转一下.我下载看了你的那个代码还是有些麻烦的 c/c++我不会那我用C# 也OK 把 OK,只要能完成,用什么都OK,结贴给分吧 用java3D做一个模拟太阳地球月亮运动的程序 怎么获得字符串的最后一位字符 关于java发送数据包问题(socket接口) 使用数组产生的java.lang.NullPointerException错误,不知道如何解决 内部类可以引用他的包含类的成员吗?有没有什么限制? 怎么实现秒表的功能?? 初来贵地,问一个巨弱的问题!!在线等待!! 编一个既是Applet又是Application的程序需要那几个部分啊?谁能给一个例子吗? 如何用代码手工实现激活事件发生 java多线程调用方法 关于Writer Jtable如何快速更新大量数据
Java的JNI支持调用C/C++首先要注册ocx,否则就是C++也调用不成功。
另外建议你用C先调用ocx,留好接口,然后给Java调用,更简单。这个时候,做后台的最好是C#。它调用ocx是极其轻松的事情。
1、Java 编译器:随 SDK 一起提供的 javac.exe。
2、Java 虚拟机(JVM):随 SDK 一起提供的 java.exe。
3、本机方法 C 文件生成器:随 SDK 一起提供的 javah.exe。
4、定义 JNI 的库文件和本机头文件。jni.h C 头文件、jvm.lib 和 jvm.dll 或 jvm.so 文件,这些文件都是随 SDK 一起提供的
5、能够创建共享库的 C 和 C++ 编译器。最常见的两个 C 编译器是用于 Windows 的 Visual C++ 和用于基于 UNIX 系统的 cc三、Java 代码调用 C/C++ 的六个步骤1.编写 Java 代码。
2.编译 Java 代码。
3.创建 C/C++ 头文件。
4.编写 C/C++ 代码。
5.创建共享库文件。
6.运行 Java 程序。具体Demo可以参考:www.javaeye.com/topic/304594
这个应该是正解, OCX不能直接JNI, 需要再封装一次, 跟Java通信
Java 代码调用 C/C++ 的六个步骤1.编写 Java 代码。public class TestPlayer {
static {
System.loadLibrary("TestSDK");
System.loadLibrary("TestPlayer");
} public native boolean ServerCapJPEG(String sername,String url,int channel,String username,String password,int quality,String wserport);}2.编译 Java 代码。不用我教了吧……3.创建 C/C++ 头文件。javah TestPlayer生成的文件如下:/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class TestPlayer */#ifndef _Included_TestPlayer
#define _Included_TestPlayer
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: TestPlayer
* Method: ServerCapJPEG
* Signature: (Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;ILjava/lang/String;)Z
*/
JNIEXPORT jboolean JNICALL Java_TestPlayer_ServerCapJPEG
(JNIEnv *, jobject, jstring, jstring, jint, jstring, jstring, jint, jstring);#ifdef __cplusplus
}
#endif
#endif
4.编写 C/C++ 代码。在你vs里面建立一个项目TestPlayer, 项目类型为Win32 Dynamic-Link Library。点击OK。选择A simple DLL project,点击Finish…………………………5.创建共享库文件。6.运行 Java 程序。
完全按照http://www.javaeye.com/topic/304594一步步来的,我这里没有测试环境,只能你自己测试了~,你看服务器已经安装过这个摄像头的驱动了,看看他里面的SDK的dll的名称叫什么,然后修改下上面的TestSDK就可以了,把你生成的TestPlayer放到java class的地方,运行下测试看看了
这个我懂问题是别人提供了DLL我怎么用?确实不好做啊好苯阿 我
首先一点:
你现在要想用java直接点SDK里的dll是不可能的,因为现有的dll不是按照jni方式做的。关于jni和dll做成,这个已经说得比较清楚了。
我补充一下:
1,写java,把需要调c/c++的方法写成vnative
2。javah声称c/c++头文件
3,VC创建链接库工程,把2的头文件整到工程里面
4,实现2的头文件定义的方法
5,在4的方法里面调用SDK中的dll(这个要求你会c/c++)
6,打dll
7, System.loadLibrary("dllName");--这里的dllName是你自己用VC做的那个,不是厂家给你的dll名,这个一定要想明白了
C# 的话是不是可以直接用这个OCX 阿
jni的我们自己写的那个java文件生成的dll就是一座桥,我在前面的例子中已经给你写了System.loadLibrary("TestSDK");
System.loadLibrary("TestPlayer");,这个地方是直接加载2个dll,一个是你自己写的将要生成的dll,一个就是sdk的dll,qingkangxu 童鞋说的第5步我不敢轻易说错,只敢这么说,如果你系统已经加载过了这个dll就不用再加载了,直接调用接口就可以了,就比如window的 MessageBox()我还要用c++的方法加载下系统的dll,然后在调用这个方法?系统已经加载过了,直接调用接口就可以了,就好像java的一个类已经有实例a了,直接a.get()就搞定了,就不用在new了,我的意思,你的明白?
你不导入他们的SDK的头文件,你怎么调用他们的SDK?头文件就相当于声明,只有声明过才可以引用,否则你编译就会出错,这个就相当于java的import
OK,只要能完成,用什么都OK,结贴给分吧