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 );
展开
 我来答
歪瑞顾K
推荐于2016-08-29 · TA获得超过2905个赞
知道大有可为答主
回答量:2731
采纳率:33%
帮助的人:2193万
展开全部
你的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才能解析其中含义。
追问
我查到的资料里也是说.h文件应由java文件生成而来,但是我现在的状况是.h文件和.o文件是客户给的,能改么~改了之后能用么。
追答
思维咋这么死板呢,JNI生成了头文件,然后再在实现的代码里,去调用另一个.h文件的函数
匿名用户
2013-09-09
展开全部
写JNI ,就可以了。

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,不会是嵌入式中的吧。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
小狂中E
2013-09-09 · TA获得超过1418个赞
知道大有可为答主
回答量:1514
采纳率:66%
帮助的人:1016万
展开全部
先在类中声明native方法如
public class A
{
public native String encrypt(String pwd, String key); //声明native方法
static {
System.loadLibrary("encrypt"); //声明加载动态库
}
}
javac A.java
javah A //生成头文件
最后根据头文件创建动态库
追问
我这状况是从客户那里拿到了.h文件和.o文件,顺序颠倒了,能搞么……
追答
当然是你自己写动态库再调用客户的程序
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式