关于网友提出的“ 处女贴:linux下通过JNI用C/C++中调用JAVA类,java类添加依赖包后,c++无法调用,无法找到class”问题疑问,本网通过在网上对“ 处女贴:linux下通过JNI用C/C++中调用JAVA类,java类添加依赖包后,c++无法调用,无法找到class”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 处女贴:linux下通过JNI用C/C++中调用JAVA类,java类添加依赖包后,c++无法调用,无法找到class
描述:c++java
案例原帖 http://blog.sina.com.cn/s/blog_48eef8410100fjxr.html
照着这样的例子下来是可以调用的,但import一个简单依赖包后就无法调用了,cpp代码如下
#include
#include
#include
#include
#include
#include
jstring stoJstring(JNIEnv* env, const char* pat)
{
jclass strClass = env->FindClass("java/lang/String");
jmethodID ctorID = env->GetMethodID(strClass, "", "([BLjava/lang/String;)V");
jbyteArray bytes = env->NewByteArray(strlen(pat));
env->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat);
jstring encoding = env->NewStringUTF("utf-8");
return (jstring)env->NewObject(strClass, ctorID, bytes, encoding);
}
char* jstringTostring(JNIEnv* env, jstring jstr)
{
char* rtn = NULL;
jclass clsstring = env->FindClass("java/lang/String");
jstring strencode = env->NewStringUTF("utf-8");
jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr, mid, strencode);
jsize alen = env->GetArrayLength(barr);
jbyte* ba = env->GetByteArrayElements(barr,JNI_FALSE);
if(alen > 0){
rtn = (char*)malloc(alen + 1);
memcpy(rtn, ba, alen);
rtn[alen] = 0;
}
env->ReleaseByteArrayElements(barr, ba, 0);
return rtn;
}
using namespace std;
int main()
{
JavaVMOption options[2];
JNIEnv *env;
JavaVM *jvm;
JavaVMInitArgs vm_args;
long status;
jclass cls;
jmethodID mid;
jint square;
jboolean jnot;
jobject jobj;
options[0].optionString = "-Djava.compiler=NONE";
options[1].optionString = "-Djava.class.path=./;/home/grid/app/Test/lib/test.jar";
cout<<><>
//options[2].optionString = "-verbose:jni"; 用于跟踪运行时的信息
vm_args.version = JNI_VERSION_1_4; // JDK版本号
vm_args.nOptions = 2;
vm_args.options = options;
vm_args.ignoreUnrecognized = JNI_TRUE;
status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
if(status != JNI_ERR){
printf("create java jvm success\n");
cls = env->FindClass("com/test/MyTest"); // 在这里查找ava类
if(cls !=0){
printf("find java class success\n");
// 构造函数
mid = env->GetMethodID(cls,"","(II)I");
if(mid !=0){
jobj=env->NewObject(cls,mid);
std::cout << "init ok" << std::endl;
}
// 调用add函数
mid = env->GetStaticMethodID( cls, "add", "(II)I");
if(mid !=0){
square = env->CallStaticIntMethod( cls, mid, 5,5);
std::cout << square << std::endl;
}
// 调用judge函数
}
else{
fprintf(stderr, "FindClass failed\n");
}
jvm->DestroyJavaVM();
fprintf(stdout, "Java VM destory.\n");
return 0;
}
else{
printf("create java jvm fail\n");
return -1;
}
}
Mytest.java
package com.test;
import rtest.Test;
public class Mytest {
static Test sb = new Test();
public static int add(int a, int b) {
return sb.ad(a, b) + a + b;
}
public boolean judge(boolean bool) {
return !bool;
}
public static void main(String[] args) {
System.out.println(add(5, 5));
}
}
Test.java
package rtest;
public class Test {
public int ad(int a, int b) {
return a + b;
}
}
java独立运行是成功的
c++调用就提示FindClass failed
在网上找了好多答案都是说启动参数要加上依赖包路径,可我加了还是一样
options[1].optionString = "-Djava.class.path=./;/home/grid/app/Test/lib/test.jar";
跪求大侠解答,在线等
解决方案1: options[1].optionString = "-Djava.class.path=./;/home/grid/app/Test/lib/test.jar";
他妈的这里是用冒号分隔的你用分号???
以上介绍了“ 处女贴:linux下通过JNI用C/C++中调用JAVA类,java类添加依赖包后,c++无法调用,无法找到class”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3633033.html