Linux环境下java调用C

Linux环境下java调用C,第1张

你的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才能解析其中含义。

Windows先调用C++ 用C++加载.net类库 然后获取委托对应C++函数指针

Linux下的没有做过

不过微软已经有Linux下的框架了

具体你可以去看在Linux下如何用C++加载类库以及Linux下。net宿主结构


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/6263176.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-19
下一篇 2023-03-19

发表评论

登录后才能评论

评论列表(0条)

保存