Linux环境下java调用C
现在从客户那里只能拿到一个.o文件和一个.h文件,是一个字符串加密方法,怎样用java调用之~这是.h文件中的内容:#ifndef_DESPKG_H#define_DES...
现在从客户那里只能拿到一个.o文件和一个.h文件,是一个字符串加密方法,怎样用java调用之~
这是.h文件中的内容:
#ifndef _DESPKG_H
#define _DESPKG_H
void encryptpswd(char *Password, char *EncryptedKey ); 展开
这是.h文件中的内容:
#ifndef _DESPKG_H
#define _DESPKG_H
void encryptpswd(char *Password, char *EncryptedKey ); 展开
3个回答
展开全部
你的JNI 写错了吧
java里的 char和 C的char完全不是一回事
java里你要写 stringjava_encryptpswd(string Password, string EncryptedKey );
生成的 C头文件,应该是 jstring java_encryptpswd(JEnvi* pEnvi,jstring Password,jstring EncryptedKey)
我手写的,没查资料,大概是这样。。
然后第一个参数是当前虚拟机事例,里面有很多可用的函数
后面两个是java里字符串结构,在C里面的表示法, 其实它就是指针而已。
然后你可以用pEnvi里的函数,将java的string,转化成 c的string。
然后调用 C的头文件的函数,得到结果,在组装成java的字符串。
比如例子:
我要用C来实现 java的字符串定位。
No.1 定义java的本地接口
public native String NAConvert(String arg1,String arg2);
No.2 生成头文件
JNIEXPORT jstring JNICALL Java_com_test_mainandroid_MainAndroidNative_NAConvert
(JNIEnv *, jobject, jstring, jstring);
No.3 自己创建一个实现文件,实现上面函数
jstring Java_com_test_mainandroid_MainAndroidNative_NAConvert
(JNIEnv* env, jobject obj, jstring arg1, jstring arg2)
{
jsize len = env->GetStringLength(arg1);
jchar* pBuf = new jchar[len+1];
env->GetStringRegion(arg1,0,len,pBuf);
jclass m = env->FindClass("java/lang/String");
jmethodID mid = env->GetMethodID(m,"charAt","(I)C");
jchar c = env->CallCharMethod(arg1,mid,1);
return arg1 ;
}
第一个是虚拟机事例指针,第二个参数是接口方法所在对象的 this。
第三个及以后才是你的接口的参数。
java里传入的所有对象参数,在C里面都是句柄。必须要用第一个参数env才能解析其中含义。
java里的 char和 C的char完全不是一回事
java里你要写 stringjava_encryptpswd(string Password, string EncryptedKey );
生成的 C头文件,应该是 jstring java_encryptpswd(JEnvi* pEnvi,jstring Password,jstring EncryptedKey)
我手写的,没查资料,大概是这样。。
然后第一个参数是当前虚拟机事例,里面有很多可用的函数
后面两个是java里字符串结构,在C里面的表示法, 其实它就是指针而已。
然后你可以用pEnvi里的函数,将java的string,转化成 c的string。
然后调用 C的头文件的函数,得到结果,在组装成java的字符串。
比如例子:
我要用C来实现 java的字符串定位。
No.1 定义java的本地接口
public native String NAConvert(String arg1,String arg2);
No.2 生成头文件
JNIEXPORT jstring JNICALL Java_com_test_mainandroid_MainAndroidNative_NAConvert
(JNIEnv *, jobject, jstring, jstring);
No.3 自己创建一个实现文件,实现上面函数
jstring Java_com_test_mainandroid_MainAndroidNative_NAConvert
(JNIEnv* env, jobject obj, jstring arg1, jstring arg2)
{
jsize len = env->GetStringLength(arg1);
jchar* pBuf = new jchar[len+1];
env->GetStringRegion(arg1,0,len,pBuf);
jclass m = env->FindClass("java/lang/String");
jmethodID mid = env->GetMethodID(m,"charAt","(I)C");
jchar c = env->CallCharMethod(arg1,mid,1);
return arg1 ;
}
第一个是虚拟机事例指针,第二个参数是接口方法所在对象的 this。
第三个及以后才是你的接口的参数。
java里传入的所有对象参数,在C里面都是句柄。必须要用第一个参数env才能解析其中含义。
追问
我查到的资料里也是说.h文件应由java文件生成而来,但是我现在的状况是.h文件和.o文件是客户给的,能改么~改了之后能用么。
追答
思维咋这么死板呢,JNI生成了头文件,然后再在实现的代码里,去调用另一个.h文件的函数
2013-09-09
展开全部
写JNI ,就可以了。
JAVAH 生成C的定义,在C中使用你客户给的.h的函数原型,调用你客户的.o
JAVAH 生成C的定义,在C中使用你客户给的.h的函数原型,调用你客户的.o
更多追问追答
追问
你好,我之前也在网上搜了些相关信息。
我大致写了个JNI类,生成的.h文件与客户给我的文件大相径庭,至少行数上多了很多。
并且我在尝试使用o文件来生成so文件时,会报这个错误:
file not recognized: File format not recognized
这是我使用的命令:
gcc -shared despkg.o -o libdespkg.so
能具体指导下么,我没学过C,很是吃力~
追答
File format not recognized
是什么环境下的.o,不会是嵌入式中的吧。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
先在类中声明native方法如
public class A
{
public native String encrypt(String pwd, String key); //声明native方法
static {
System.loadLibrary("encrypt"); //声明加载动态库
}
}
javac A.java
javah A //生成头文件
最后根据头文件创建动态库
public class A
{
public native String encrypt(String pwd, String key); //声明native方法
static {
System.loadLibrary("encrypt"); //声明加载动态库
}
}
javac A.java
javah A //生成头文件
最后根据头文件创建动态库
追问
我这状况是从客户那里拿到了.h文件和.o文件,顺序颠倒了,能搞么……
追答
当然是你自己写动态库再调用客户的程序
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询