使用JNI从C ++程序中执行一个java jar,使用g ++或eclipse [英] Using JNI to execute a java jar from a C++ program, using g++ or eclipse

查看:1432
本文介绍了使用JNI从C ++程序中执行一个java jar,使用g ++或eclipse的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要尝试从 C ++ 程序调用/ 执行一个java jar。



这里是我到目前为止找到的选项:

 使用JNI 
使用Jace
使用JunC ++ ion
使用execl(java,java,-jar,myprog.jar,NULL);
使用execlp(java,java,-jar,myprog.jar,(char *)0);
使用system(java filename.jar);
使用popen(java -jar test.jar text1 text2,r);
使用CreateProcess(...);
使用JNA

我想使用JNI, 。



=========================

Hello.cpp



我有一个简单的Hello.cpp类:

  #include< iostream> 
#include< jni.h>

using namespace std;

int main(){
cout<< Hello World< endl; // prints Hello World

JavaVM * jvm; / *表示Java VM * /
JNIEnv * env; / *指向本地方法接口的指针* /
JDK1_1InitArgs vm_args; / * JDK 1.1 VM初始化参数* /
vm_args.version = 0x00010001; / * 1.1.2新增:VM版本* /
/ *获取默认初始化参数并设置类
* path * /
JNI_GetDefaultJavaVMInitArgs(& vm_args);
vm_args.classpath =/home/FinishedJars/HelloWorld/hello2.jar;
/ *加载并初始化Java VM,在env * /
中返回JNI接口
*指针JNI_CreateJavaVM(& jvm,& env,& vm_args);
/ *使用JNI调用Main.test方法* /
jclass cls = env-> FindClass(Main);
jmethodID mid = env-> GetStaticMethodID(cls,test,(I)V);
env-> CallStaticVoidMethod(cls,mid,100);
/ *我们可以创建一个对象,并调用它的方法* /
/ *我们完成了。 * /
jvm-> DestroyJavaVM();

return 0;
}

================ ========



编译



当我尝试编译时, / p>

  g ++ -I /usr/lib/jvm/jdk1.6.0_34-x86/include/ Hello.cpp 

注意:我在该文件夹中找到jni.h,所以我包含了它。我假设这是正确的位置,但我不确定



我得到了大量错误(见下文)



======================



错误



我从jni.h获取了一百万个错误,就好像它试图编译jni.h:

  /usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数'void JNIEnv _ :: SetStaticLongField(_jclass *,_jfieldID *,int)' :
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1568:error:'const struct JNINativeInterface_'没有名为'SetStaticLongField'的成员
/ usr / lib / jvm / jdk1.6.0_34-x86 / include / jni.h:在成员函数'void JNIEnv _ :: SetStaticFloatField(_jclass *,_jfieldID *,jfloat)':
/usr/lib/jvm/jdk1.6.0_34 -x86 / include / jni.h:1572:error:'const struct JNINativeInterface_'没有名为'SetStaticFloatField'的成员
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:In成员函数'void JNIEnv _ :: SetStaticDoubleField(_jclass *,_jfieldID *,jdouble)':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1576:error:'const struct JNINativeInterface_'没有名为'SetStaticDoubleField'的成员
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数'_jstring * JNIEnv _ :: NewString(const jchar *,int) ':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1580:error:'const struct JNINativeInterface_'没有名为'NewString'的成员
/ usr / lib /jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数'const jchar * JNIEnv _ :: GetStringChars(_jstring *,jboolean *)':
/usr/lib/jvm/jdk1.6.0 _34-x86 / include / jni.h:1586:error:'const struct JNINativeInterface_'没有名为'GetStringChars'的成员
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数'void JNIEnv _ :: ReleaseStringChars(_jstring *,const jchar *)':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1589:error:'const struct JNINativeInterface_'没有成员名为'ReleaseStringChars'
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数'_jstring * JNIEnv _ :: NewStringUTF(const char *)':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1593:error:'const struct JNINativeInterface_'没有名为'NewStringUTF'的成员
/ usr / lib / jvm /jdk1.6.0_34-x86/include/jni.h:在成员函数'const char * JNIEnv _ :: GetStringUTFChars(_jstring *,jboolean *)':
/usr/lib/jvm/jdk1.6.0_34- x86 / include / jni.h:1599:error:'const struct JNINativeInterface_'没有名为'GetStringUTFChars'的成员
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:函数'void JNIEnv _ :: ReleaseStringUTFChars(_jstring *,const char *)':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1602:error:'const struct JNINativeInterface_'没有成员名为'ReleaseStringUTFChars'
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数'_jobjectArray * JNIEnv _ :: NewObjectArray(int,_jclass *,_jobject *) ':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1611:error:'const struct JNINativeInterface_'没有名为'NewObjectArray'的成员
/ usr / lib /jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数'_jobject * JNIEnv _ :: GetObjectArrayElement(_jobjectArray *,int)':
/usr/lib/jvm/jdk1.6.0_34- x86 / include / jni.h:1614:error:'const struct JNINativeInterface_'没有名为'GetObjectArrayElement'的成员
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: function'void JNIEnv _ :: SetObjectArrayElement(_jobjectArray *,int,_jobject *)':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1618:error:'const struct JNINativeInterface_ '没有成员名为'SetObjectArrayElement'
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数'_jbooleanArray * JNIEnv _ :: NewBool​​eanArray(int)':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1622:错误:'const struct JNINativeInterface_'没有成员名为'NewBool​​eanArray'
/ usr / lib / jvm / jdk1。 6.0_34-x86 / include / jni.h:在成员函数'_jbyteArray * JNIEnv _ :: NewByteArray(int)':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: 1625:error:'const struct JNINativeInterface_'没有名为'NewByteArray'的成员
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数'_jcharArray * JNIEnv _ :: NewCharArray (int)':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1628:error:'const struct JNINativeInterface_'没有成员命名为'NewCharArray'
/ usr / lib / jvm / jdk1.6.0_34-x86 / include / jni.h:在成员函数'_jshortArray * JNIEnv _ :: NewShortArray(int)':
/usr/lib/jvm/jdk1.6.0_34- x86 / include / jni.h:1631:error:'const struct JNINativeInterface_'没有成员名为'NewShortArray'
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: function'_jintArray * JNIEnv _ :: NewIntArray(int)':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1634:error:'const struct JNINativeInterface_'没有成员名'newIntArray'
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数'_jlong​​Array * JNIEnv _ :: NewLongArray(int)':
/ usr / lib /jvm/jdk1.6.0_34-x86/include/jni.h:1637:error:'const struct JNINativeInterface_'没有名为'NewLongArray'的成员
/usr/lib/jvm/jdk1.6.0_34-x86/ include / jni.h:在成员函数'_jfloatArray * JNIEnv _ :: NewFloatArray(int)':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1640:error: const struct JNINativeInterface_'没有成员名为'NewFloatArray'
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数'_jdoubleArray * JNIEnv _ :: NewDoubleArray(int)':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1643:error:'const struct JNINativeInterface_'没有名为'NewDoubleArray'的成员
/ usr / lib / jvm /jdk1.6.0_34-x86/include/jni.h:在成员函数'jboolean * JNIEnv _ :: GetBooleanArrayElements(_jbooleanArray *,jboolean *)':
/usr/lib/jvm/jdk1.6.0_34-x86 /include/jni.h:1647:error:'const struct JNINativeInterface_'没有名为GetBooleanArrayElements的成员
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数'jchar * JNIEnv _ :: GetCharArrayElements(_jcharArray *,jboolean *)':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1653:error:'const struct JNINativeInterface_'has没有成员名为GetCharArrayElements
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数'jshort * JNIEnv _ :: GetShortArrayElements(_jshortArray *,jboolean *)':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1656:错误:'const struct JNINativeInterface_'没有名为'GetShortArrayElements'的成员
/ usr / lib / jvm / jdk1.6.0_34-x86 / include / jni.h:在成员函数'jfloat * JNIEnv _ :: GetFloatArrayElements(_jfloatArray *,jboolean *)':
/usr/lib/jvm/jdk1.6.0_34-x86/ include / jni.h:1665:error:'const struct JNINativeInterface_'没有名为'GetFloatArrayElements'的成员
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数' jdouble * JNIEnv _ :: GetDoubleArrayElements(_jdoubleArray *,jboolean *)':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1668:error:'const struct JNINativeInterface_'has no成员名为'GetDoubleArrayElements'
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数'void JNIEnv _ :: ReleaseBooleanArrayElements(_jbooleanArray *,jboolean *,int)':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1674:错误:'const struct JNINativeInterface_'没有名为'ReleaseBooleanArrayElements'的成员
/ usr / lib / jvm / jdk1.6.0_34-x86 / include / jni.h:在成员函数'void JNIEnv _ :: ReleaseByteArrayElements(_jbyteArray *,int *,int)':
/usr/lib/jvm/jdk1.6.0_34-x86 /include/jni.h:1679:error:'const struct JNINativeInterface_'没有名为'ReleaseByteArrayElements'的成员
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数'void JNIEnv _ :: ReleaseCharArrayElements(_jcharArray *,jchar *,int)':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1684:error:'const struct JNINativeInterface_'没有成员名为'ReleaseCharArrayElements'
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数'void JNIEnv _ :: ReleaseShortArrayElements(_jshortArray *,jshort *,int)' :
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1689:error:'const struct JNINativeInterface_'没有名为'ReleaseShortArrayElements'的成员
/ usr / lib / jvm / jdk1.6.0_34-x86 / include / jni.h:在成员函数'void JNIEnv _ :: ReleaseIntArrayElements(_jintArray *,int *,int)':
/usr/lib/jvm/jdk1.6.0_34 -x86 / include / jni.h:1694:error:'const struct JNINativeInterface_'没有名为'ReleaseIntArrayElements'的成员
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:In成员函数'void JNIEnv _ :: ReleaseLongArrayElements(_jlong​​Array *,int *,int)':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1699:error:'const struct JNINativeInterface_'没有名为'ReleaseLongArrayElements'的成员
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数'void JNIEnv _ :: ReleaseFloatArrayElements(_jfloatArray *,jfloat *,int )':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1704:error:'const struct JNINativeInterface_'没有名为'ReleaseFloatArrayElements'的成员
/ usr / lib / jvm / jdk1.6.0_34-x86 / include / jni.h:在成员函数'void JNIEnv _ :: ReleaseDoubleArrayElements(_jdoubleArray *,jdouble *,int)':
/ usr / lib / jvm / jdk1。 6.0_34-x86 / include / jni.h:1709:error:'const struct JNINativeInterface_'没有名为'ReleaseDoubleArrayElements'的成员
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h :在成员函数'void JNIEnv _ :: GetBooleanArrayRegion(_jbooleanArray *,int,int,jboolean *)':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1714:error :'const struct JNINativeInterface_'没有名为'GetBooleanArrayRegion'的成员
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数'void JNIEnv _ :: GetByteArrayRegion(_jbyteArray *, int,int,int *)':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1718:error:'const struct JNINativeInterface_'没有名为'GetByteArrayRegion'的成员
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数'void JNIEnv _ :: GetCharArrayRegion(_jcharArray *,int,int,jchar *)':
/ usr / lib / jvm / jdk1.6.0_34-x86 / include / jni.h:1722:error:'const struct JNINativeInterface_'没有名为'GetCharArrayRegion'的成员
/usr/lib/jvm/jdk1.6.0_34 -x86 / include / jni.h:在成员函数'void JNIEnv _ :: GetShortArrayRegion(_jshortArray *,int,int,jshort *)':
/usr/lib/jvm/jdk1.6.0_34-x86/include /jni.h:1726:error:'const struct JNINativeInterface_'没有名为GetShortArrayRegion的成员
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数'void JNIEnv _ :: GetIntArrayRegion(_jintArray *,int,int,int *)':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1730:error:'const struct JNINativeInterface_'没有成员名为GetIntArrayRegion
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数'void JNIEnv _ :: GetLongArrayRegion(_jlong​​Array *,int,int,int * )':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1734:error:'const struct JNINativeInterface_'没有名为'GetLongArrayRegion'的成员
/ usr / lib / jvm / jdk1.6.0_34-x86 / include / jni.h:在成员函数'void JNIEnv _ :: GetFloatArrayRegion(_jfloatArray *,int,int,jfloat *)':
/ usr / lib / jvm / jdk1.6.0_34-x86 / include / jni.h:1738:error:'const struct JNINativeInterface_'没有名为GetFloatArrayRegion的成员
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni .h:在成员函数'void JNIEnv _ :: GetDoubleArrayRegion(_jdoubleArray *,int,int,jdouble *)':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1742 :错误:'const struct JNINativeInterface_'没有名为'GetDoubleArrayRegion'的成员
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数'void JNIEnv _ :: SetBooleanArrayRegion(_jbooleanArray *,int,int,const jboolean *)':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1747:error:'const struct JNINativeInterface_'没有成员名为' SetBooleanArrayRegion'
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数'void JNIEnv _ :: SetByteArrayRegion(_jbyteArray *,int,int,int)':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1751:错误:'const struct JNINativeInterface_'没有名为SetByteArrayRegion的成员
/ usr / lib / jvm / jdk1。 6.0_34-x86 / include / jni.h:1751:错误:'buf'未在此范围中声明
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在成员function'void JNIEnv _ :: SetCharArrayRegion(_jcharArray *,int,int,const jchar *)':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1755:error: const JNINativeInterface_'没有成员名为'SetCharArrayRegion'
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数'void JNIEnv _ :: SetShortArrayRegion(_jshortArray *,int, int,const jshort *)':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1759:error:'const struct JNINativeInterface_'没有名为'SetShortArrayRegion'的成员
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数'void JNIEnv _ :: SetIntArrayRegion(_jintArray *,int,int,int)':
/ usr / lib / jvm / jdk1.6.0_34-x86 / include / jni.h:1763:error:'const struct JNINativeInterface_'没有名为SetIntArrayRegion的成员
/usr/lib/jvm/jdk1.6.0_34-x86 /include/jni.h:1763:error:'buf'未在此范围中声明
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数'void JNIEnv_ :: SetLongArrayRegion(_jlong​​Array *,int,int,int)':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1767:error:'const struct JNINativeInterface_'has no成员名为'SetLongArrayRegion'
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1767:错误:'buf'未在此范围中声明
/ usr / lib /jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数'void JNIEnv _ :: SetFloatArrayRegion(_jfloatArray *,int,int,const jfloat *)':
/ usr / lib / jvm / jdk1.6.0_34-x86 / include / jni.h:1771:error:'const struct JNINativeInterface_'没有名为'SetFloatArrayRegion'的成员
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni .h:在成员函数'void JNIEnv _ :: SetDoubleArrayRegion(_jdoubleArray *,int,int,const jdouble *)'中:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: 1775:error:'const struct JNINativeInterface_'没有名为'SetDoubleArrayRegion'的成员
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数'void JNIEnv _ :: GetStringRegion _jstring *,int,int,jchar *)':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1798:error:'const struct JNINativeInterface_'没有成员名为' GetStringRegion'
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数'void JNIEnv _ :: GetStringUTFRegion(_jstring *,int,int,char *)':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1801:error:'const struct JNINativeInterface_'没有名为'GetStringUTFRegion'的成员
/ usr / lib / jvm / jdk1 .6.0_34-x86 / include / jni.h:在成员函数'void * JNIEnv _ :: GetPrimitiveArrayCritical(_jarray *,jboolean *)':
/usr/lib/jvm/jdk1.6.0_34-x86/include /jni.h:1805:error:'const struct JNINativeInterface_'没有名为'GetPrimitiveArrayCritical'的成员
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数'void JNIEnv _ :: ReleasePrimitiveArrayCritical(_jarray *,void *,int)':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1808:error:'const struct JNINativeInterface_'has no成员名为ReleasePrimitiveArrayCritical
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数const jchar * JNIEnv _ :: GetStringCritical(_jstring *,jboolean *)':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1812:error:'const struct JNINativeInterface_'没有名为'GetStringCritical'的成员
/ usr / lib / jvm / jdk1.6.0_34-x86 / include / jni.h:在成员函数'void JNIEnv _ :: ReleaseStringCritical(_jstring *,const jchar *)':
/usr/lib/jvm/jdk1.6.0_34-x86/ include / jni.h:1815:error:'const struct JNINativeInterface_'没有名为'ReleaseStringCritical'的成员
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数' _jobject * JNIEnv _ :: NewWeakGlobalRef(_jobject *)':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1819:error:'const struct JNINativeInterface_'没有成员名为' NewWeakGlobalRef'
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数'void JNIEnv _ :: DeleteWeakGlobalRef(_jobject *)':
/ usr / lib / jvm / jdk1.6.0_34-x86 / include / jni.h:1822:error:'const struct JNINativeInterface_'没有成员名为'DeleteWeakGlobalRef'
/usr/lib/jvm/jdk1.6.0_34-x86/include /jni.h:在成员函数'jboolean JNIEnv _ :: ExceptionCheck()':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1826:error:'const struct JNINativeInterface_ '没有成员名为'ExceptionCheck'
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数'_jobject * JNIEnv _ :: NewDirectByteBuffer(void *,int)':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1830:error:'const struct JNINativeInterface_'没有成员名为'NewDirectByteBuffer'
/ usr / lib / jvm /jdk1.6.0_34-x86/include/jni.h:在成员函数'void * JNIEnv _ :: GetDirectBufferAddress(_jobject *)':
/usr/lib/jvm/jdk1.6.0_34-x86/include/ jni.h:1833:error:'const struct JNINativeInterface_'没有成员名为'GetDirectBufferAddress'
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在成员函数'jobjectRefType JNIEnv_ :: GetObjectRefType(_jobject *)':
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1839:error:'const struct JNINativeInterface_'没有名为'GetObjectRefType'的成员b $ b /usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:在全局范围:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h :1851:error:'jint'没有命名类型
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1853:错误:'jint'没有命名类型
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1859:错误:'jint'没有命名类型
/usr/lib/jvm/jdk1.6.0_34 -x86 / include / jni.h:1877:错误:'JNICALL'尚未声明
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1877:error:ISO C ++禁止声明'jint'没有类型
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1877:错误:'jint'声明为函数返回一个函数
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1879:错误:'JNICALL'尚未声明
/usr/lib/jvm/jdk1.6.0_34-x86/include /jni.h:1879:error:ISO C ++禁止没有类型
的声明'jint'/ /usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1879:error:'jint '声明为函数返回一个函数
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1881:错误:'JNICALL'尚未声明
/ usr / lib /jvm/jdk1.6.0_34-x86/include/jni.h:1881:error:ISO C ++禁止没有类型
的'jint'声明/usr/lib/jvm/jdk1.6.0_34-x86/include /jni.h:1881:error:'jint'声明为函数返回一个函数
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1883:error:'JNICALL'has未声明
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1883:错误:'jint'尚未声明
/ usr / lib / jvm / jdk1 .6.0_34-x86 / include / jni.h:1883:error:ISO C ++禁止声明'jint',没有类型
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h :1883:error:'jint'声明为函数返回一个函数
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1885:错误:'JNICALL'尚未声明
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1885:错误:ISO C ++禁止声明'jint',没有类型
/ usr / lib / jvm / jdk1 .6.0_34-x86 / include / jni.h:1885:error:'jint'声明为函数返回一个函数
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1892 :错误:'jint'不命名类型
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1895:错误:'jint'没有命名类型
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1898:错误:'jint'不命名类型
/usr/lib/jvm/jdk1.6.0_34-x86 /include/jni.h:1902:error:'jint'不命名类型
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1905:error:'jint'不命名类型
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1916:错误:'JNIIMPORT'不命名类型
/ usr / lib / jvm / jdk1.6.0_34-x86 / include / jni.h:1919:error:'JNIIMPORT'没有命名类型
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h :1922:error:'JNIIMPORT'没有命名类型
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1926:错误:'JNIEXPORT'没有命名类型
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1929:error:expected之前的构造函数,析构函数或类型转换
2013-03-21-1356 -Hello-GCC-Ex.cpp:在函数'int main()':
2013-03-21-1356-Hello-GCC-Ex.cpp:19:error:'JDK1_1InitArgs' scope
2013-03-21-1356-Hello-GCC-Ex.cpp:19:error:expected';'before'vm_args'
2013-03-21-1356-Hello-GCC-Ex .cpp:20:error:'vm_args'未在此范围中声明
2013-03-21-1356-Hello-GCC-Ex.cpp:23:错误:'JNI_GetDefaultJavaVMInitArgs'未在此范围中声明
2013-03-21-1356-Hello-GCC-Ex.cpp:27:错误:'JNI_CreateJavaVM'未在此范围中声明
2013-03-21-1356-Hello-GCC-Ex。 cpp:34:error:'struct JavaVM_'没有名为DestroyJavaVM的成员

==== ====================



详细资讯:





之后,我添加了一个可执行文件,用于创建一个可执行的空gcc项目,创建我的hello世界代码, jni代码,并导入源代码:



右键单击项目 - >属性 - > C / C ++常规 - >路径和符号 - >包含 - > GNU C ++ - > Add - >



然后添加包含jni.h的目录



这样,在eclipse中,我得到完全相同的错误。



此外,我在Ubuntu 10 64位...上运行...



======================



有人可以帮忙吗? / p>

这可能是一个非常简单的导入问题,但我不确定



====== ==================



更新1



执行:



g ++ -I /usr/lib/jvm/jdk1.7.0_06/include/ -I / usr / lib / jvm / jdk1 .7.0_06 / include / linux / Hello.cpp



给我:

  Hello.cpp:在函数'int main()':
Hello.cpp:19:error:'JDK1_1InitArgs'没有在这个范围内声明
你好。 cpp:19:error:expected';'before'vm_args'
Hello.cpp:20:error:'vm_args'未在此范围中声明

=================================

UPDATE 2



很明显,在JDK 6中删除了JDK1_1InitArgs,所以我用JDK 5 jni.h编译,如下:



g ++ -I /usr/lib/jvm/jdk1.5.0_22-x86/include/ -I /usr/lib/jvm/jdk1.5.0_22-x86/include/linux / Hello.cpp



,它给了我:

 code> Hello.cpp:在函数'int main()':
Hello.cpp:24:warning:deprecated从字符串常量转换为'char *'
Hello.cpp:27:错误:从'JNIEnv **'到'void **'的无效转换
Hello.cpp:27:错误:初始化'jint JNI_CreateJavaVM(JavaVM **,void **,void *)'$ b的参数2 $ b

========================= =



UPDATE 3



我一直在做一些研究,可能的解决方案是:


  1. Add -L / usr / X11R6 / lib ,或者X11库在哪里,到
    g ++命令...没有效果。

  2. 添加ibhpi.so的路径和libjvm.so到LD_LIBRARY_PATH (对我来说是在/usr/lib/jvm/jdk1.5.0_22-x86/jre/lib/i386/native_threads /)...没有效果

  3. 将libjava.so添加到LD_LIBRARY_PATH ( mine is at /usr/lib/jvm/jdk1.5.0_22-x86/jre/lib/i386 /)...没有效果

  4. 将jre / lib添加到LD_LIBRARY_PATH .. 。没有效果

我的一个最终构建命令(尽管仍然无法工作)

  g ++ -g 
-I /usr/lib/jvm/jdk1.5.0_22-x86/include/
-I / usr / lib / jvm / jdk1.5.0_22-x86 / include / linux /
-L ​​/ usr / lib / jvm / jdk1.5.0_22-x86 / jre / lib / i386 /
Hello.cpp

错误:

  Hello.cpp:23:未定义引用`JNI_GetDefaultJavaVMInitArgs'
Hello.cpp:27:未定义引用`JNI_CreateJavaVM'

我改变了& env到(void **)& env,由ldav1s建议摆脱void star错误



=====================



UPDATE 4



我相信问题是我正在尝试加载不是为我的系统构建的库...



我当前的命令是:

  g ++ 
-L ​​/ usr / lib / jvm / jdk1.5.0_22-x86 / lib
-L ​​/ usr /lib/jvm/jdk1.5.0_22-x86/jre/lib
-L ​​/ usr / lib / jvm / jdk1.5.0_22-x86 / jre / lib / i386 -ljava
-L ​​/ usr /lib/jvm/jdk1.5.0_22-x86/jre/lib/i386/native_threads -lhpi
-L ​​/ usr / lib / jvm / jdk1.5.0_22-x86 / jre / lib / i386 / server -ljvm
-I /usr/lib/jvm/jdk1.5.0_22-x86/include/
-I /usr/lib/jvm/jdk1.5.0_22-x86/include/linux/
Hello.cpp

并获得:

  ... 
/ usr / bin / ld:skipping不兼容/usr/lib/jvm/jdk1.5.0_22-x86/jre/lib/i386/libjava.so when在搜索-lhpi $ b $时搜索-ljava
/ usr / bin / ld:skipping incompatible /usr/lib/jvm/jdk1.5.0_22-x86/jre/lib/i386/native_threads/libhpi.so当搜索-ljvm
/ usr / bin / ld时,b / usr / bin / ld:skipping不兼容/usr/lib/jvm/jdk1.5.0_22-x86/jre/lib/i386/server/libjvm.so :找不到-ljava
/ usr / bin / ld:找不到-lhpi
/ usr / bin / ld:找不到-ljvm
...

==============================

UPDATE 5 / SOLUTION



花了一会儿,但这给我最少的错误!

  g ++ -fPIC 
-L ​​/ usr / lib / jvm / java-6-openjdk / jre / lib
-L ​​/ usr / lib / jvm / java-6-openjdk / jre / lib / amd64 -ljava -lverify
-L ​​/ usr / lib / jvm / java-6-openjdk / jre / lib / amd64 / native_threads -lhpi
-L ​​/ usr / lib / jvm / java-6-openjdk / jre / lib / amd64 / server -ljvm
-I /usr/lib/jvm/jdk1.5.0_22-x86/include/
-I /usr/lib/jvm/jdk1.5.0_22-x86/include/linux/
Hello.cpp

警告:

  Hello.cpp:在函数'int main()':
Hello.cpp:24:warning:不推荐从字符串常量转换为'char *

在运行之前记得将amd libs添加到LD_LIBRARY_PATH:

  $ export LD_LIBRARY_PATH = / usr / lib / jvm / $ LD_LIBRARY_PATH 
$ export LD_LIBRARY_PATH = / usr / lib / jvm / java-6-openjdk / jre / lib / amd64 / native_threads:$ LD_LIBRARY_PATH
$ export LD_LIBRARY_PATH = usr / lib / jvm / java-6-openjdk / jre / lib / amd64 / server:$ LD_LIBRARY_PATH
$ export LD_LIBRARY_PATH = / usr / lib / jvm / java-6-openjdk / jre / lib:$ LD_LIBRARY_PATH

THANKS!

解决方案

通常你必须在Linux上添加一些特定于平台的目录:

  g ++ -I / usr / lib / jvm / jdk1.6.0_34-x86 / include / -I /usr/lib/jvm/jdk1.6.0_34-x86/include/linux Hello.cpp 

,因为在那里设置了一些宏(如 JNICALL )。希望这将修复jni.h错误级联。



编辑:仍然卡住了?尝试:

  JNI_CreateJavaVM(& jvm,(void **)& env,& vm_args); 

它至少会超过编译问题。我不知道是否会工作,因为我以前没有尝试过。


I'm trying to call / execute a java jar from a C++ program.

Here are the options I've found so far:

Use JNI
Use Jace
Use JunC++ion
Use execl("java", "java", "-jar", "myprog.jar", NULL);
Use execlp("java", "java", "-jar", "myprog.jar", (char *)0);
Use system("java filename.jar");
Use popen("java -jar test.jar text1 text2", "r");
Use CreateProcess(...);
Use JNA

I'd like to use JNI, however I'm running into problems.

========================

Hello.cpp

I have a simple Hello.cpp class:

#include <iostream>
#include <jni.h>

using namespace std;

int main() {
      cout << "Hello World" << endl; // prints Hello World

      JavaVM *jvm;       /* denotes a Java VM */
      JNIEnv *env;       /* pointer to native method interface */
      JDK1_1InitArgs vm_args; /* JDK 1.1 VM initialization arguments */
      vm_args.version = 0x00010001; /* New in 1.1.2: VM version */
      /* Get the default initialization arguments and set the class
       * path */
      JNI_GetDefaultJavaVMInitArgs(&vm_args);
      vm_args.classpath = "/home/FinishedJars/HelloWorld/hello2.jar";
      /* load and initialize a Java VM, return a JNI interface
       * pointer in env */
      JNI_CreateJavaVM(&jvm, &env, &vm_args);
      /* invoke the Main.test method using the JNI */
      jclass cls = env->FindClass("Main");
      jmethodID mid = env->GetStaticMethodID(cls, "test", "(I)V");
      env->CallStaticVoidMethod(cls, mid, 100);
      /* We could have created an Object and called methods on it instead */
      /* We are done. */
      jvm->DestroyJavaVM();

    return 0;
}

========================

Compile

And when I try to compile with something like:

g++ -I /usr/lib/jvm/jdk1.6.0_34-x86/include/ Hello.cpp

Note: I found "jni.h" in that folder, so I included it. I'm assuming that's the right spot, but I'm not certain

I get a ton of errors ( see below )

========================

Errors

I get a million errors from jni.h, as if it's trying to compile jni.h:

/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::SetStaticLongField(_jclass*, _jfieldID*, int)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1568: error: ‘const struct JNINativeInterface_’ has no member named ‘SetStaticLongField’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::SetStaticFloatField(_jclass*, _jfieldID*, jfloat)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1572: error: ‘const struct JNINativeInterface_’ has no member named ‘SetStaticFloatField’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::SetStaticDoubleField(_jclass*, _jfieldID*, jdouble)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1576: error: ‘const struct JNINativeInterface_’ has no member named ‘SetStaticDoubleField’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘_jstring* JNIEnv_::NewString(const jchar*, int)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1580: error: ‘const struct JNINativeInterface_’ has no member named ‘NewString’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘const jchar* JNIEnv_::GetStringChars(_jstring*, jboolean*)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1586: error: ‘const struct JNINativeInterface_’ has no member named ‘GetStringChars’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::ReleaseStringChars(_jstring*, const jchar*)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1589: error: ‘const struct JNINativeInterface_’ has no member named ‘ReleaseStringChars’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘_jstring* JNIEnv_::NewStringUTF(const char*)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1593: error: ‘const struct JNINativeInterface_’ has no member named ‘NewStringUTF’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘const char* JNIEnv_::GetStringUTFChars(_jstring*, jboolean*)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1599: error: ‘const struct JNINativeInterface_’ has no member named ‘GetStringUTFChars’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::ReleaseStringUTFChars(_jstring*, const char*)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1602: error: ‘const struct JNINativeInterface_’ has no member named ‘ReleaseStringUTFChars’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘_jobjectArray* JNIEnv_::NewObjectArray(int, _jclass*, _jobject*)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1611: error: ‘const struct JNINativeInterface_’ has no member named ‘NewObjectArray’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘_jobject* JNIEnv_::GetObjectArrayElement(_jobjectArray*, int)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1614: error: ‘const struct JNINativeInterface_’ has no member named ‘GetObjectArrayElement’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::SetObjectArrayElement(_jobjectArray*, int, _jobject*)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1618: error: ‘const struct JNINativeInterface_’ has no member named ‘SetObjectArrayElement’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘_jbooleanArray* JNIEnv_::NewBooleanArray(int)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1622: error: ‘const struct JNINativeInterface_’ has no member named ‘NewBooleanArray’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘_jbyteArray* JNIEnv_::NewByteArray(int)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1625: error: ‘const struct JNINativeInterface_’ has no member named ‘NewByteArray’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘_jcharArray* JNIEnv_::NewCharArray(int)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1628: error: ‘const struct JNINativeInterface_’ has no member named ‘NewCharArray’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘_jshortArray* JNIEnv_::NewShortArray(int)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1631: error: ‘const struct JNINativeInterface_’ has no member named ‘NewShortArray’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘_jintArray* JNIEnv_::NewIntArray(int)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1634: error: ‘const struct JNINativeInterface_’ has no member named ‘NewIntArray’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘_jlongArray* JNIEnv_::NewLongArray(int)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1637: error: ‘const struct JNINativeInterface_’ has no member named ‘NewLongArray’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘_jfloatArray* JNIEnv_::NewFloatArray(int)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1640: error: ‘const struct JNINativeInterface_’ has no member named ‘NewFloatArray’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘_jdoubleArray* JNIEnv_::NewDoubleArray(int)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1643: error: ‘const struct JNINativeInterface_’ has no member named ‘NewDoubleArray’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘jboolean* JNIEnv_::GetBooleanArrayElements(_jbooleanArray*, jboolean*)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1647: error: ‘const struct JNINativeInterface_’ has no member named ‘GetBooleanArrayElements’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘jchar* JNIEnv_::GetCharArrayElements(_jcharArray*, jboolean*)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1653: error: ‘const struct JNINativeInterface_’ has no member named ‘GetCharArrayElements’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘jshort* JNIEnv_::GetShortArrayElements(_jshortArray*, jboolean*)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1656: error: ‘const struct JNINativeInterface_’ has no member named ‘GetShortArrayElements’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘jfloat* JNIEnv_::GetFloatArrayElements(_jfloatArray*, jboolean*)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1665: error: ‘const struct JNINativeInterface_’ has no member named ‘GetFloatArrayElements’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘jdouble* JNIEnv_::GetDoubleArrayElements(_jdoubleArray*, jboolean*)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1668: error: ‘const struct JNINativeInterface_’ has no member named ‘GetDoubleArrayElements’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::ReleaseBooleanArrayElements(_jbooleanArray*, jboolean*, int)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1674: error: ‘const struct JNINativeInterface_’ has no member named ‘ReleaseBooleanArrayElements’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::ReleaseByteArrayElements(_jbyteArray*, int*, int)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1679: error: ‘const struct JNINativeInterface_’ has no member named ‘ReleaseByteArrayElements’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::ReleaseCharArrayElements(_jcharArray*, jchar*, int)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1684: error: ‘const struct JNINativeInterface_’ has no member named ‘ReleaseCharArrayElements’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::ReleaseShortArrayElements(_jshortArray*, jshort*, int)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1689: error: ‘const struct JNINativeInterface_’ has no member named ‘ReleaseShortArrayElements’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::ReleaseIntArrayElements(_jintArray*, int*, int)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1694: error: ‘const struct JNINativeInterface_’ has no member named ‘ReleaseIntArrayElements’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::ReleaseLongArrayElements(_jlongArray*, int*, int)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1699: error: ‘const struct JNINativeInterface_’ has no member named ‘ReleaseLongArrayElements’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::ReleaseFloatArrayElements(_jfloatArray*, jfloat*, int)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1704: error: ‘const struct JNINativeInterface_’ has no member named ‘ReleaseFloatArrayElements’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::ReleaseDoubleArrayElements(_jdoubleArray*, jdouble*, int)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1709: error: ‘const struct JNINativeInterface_’ has no member named ‘ReleaseDoubleArrayElements’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::GetBooleanArrayRegion(_jbooleanArray*, int, int, jboolean*)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1714: error: ‘const struct JNINativeInterface_’ has no member named ‘GetBooleanArrayRegion’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::GetByteArrayRegion(_jbyteArray*, int, int, int*)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1718: error: ‘const struct JNINativeInterface_’ has no member named ‘GetByteArrayRegion’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::GetCharArrayRegion(_jcharArray*, int, int, jchar*)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1722: error: ‘const struct JNINativeInterface_’ has no member named ‘GetCharArrayRegion’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::GetShortArrayRegion(_jshortArray*, int, int, jshort*)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1726: error: ‘const struct JNINativeInterface_’ has no member named ‘GetShortArrayRegion’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::GetIntArrayRegion(_jintArray*, int, int, int*)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1730: error: ‘const struct JNINativeInterface_’ has no member named ‘GetIntArrayRegion’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::GetLongArrayRegion(_jlongArray*, int, int, int*)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1734: error: ‘const struct JNINativeInterface_’ has no member named ‘GetLongArrayRegion’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::GetFloatArrayRegion(_jfloatArray*, int, int, jfloat*)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1738: error: ‘const struct JNINativeInterface_’ has no member named ‘GetFloatArrayRegion’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::GetDoubleArrayRegion(_jdoubleArray*, int, int, jdouble*)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1742: error: ‘const struct JNINativeInterface_’ has no member named ‘GetDoubleArrayRegion’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::SetBooleanArrayRegion(_jbooleanArray*, int, int, const jboolean*)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1747: error: ‘const struct JNINativeInterface_’ has no member named ‘SetBooleanArrayRegion’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::SetByteArrayRegion(_jbyteArray*, int, int, int)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1751: error: ‘const struct JNINativeInterface_’ has no member named ‘SetByteArrayRegion’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1751: error: ‘buf’ was not declared in this scope
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::SetCharArrayRegion(_jcharArray*, int, int, const jchar*)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1755: error: ‘const struct JNINativeInterface_’ has no member named ‘SetCharArrayRegion’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::SetShortArrayRegion(_jshortArray*, int, int, const jshort*)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1759: error: ‘const struct JNINativeInterface_’ has no member named ‘SetShortArrayRegion’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::SetIntArrayRegion(_jintArray*, int, int, int)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1763: error: ‘const struct JNINativeInterface_’ has no member named ‘SetIntArrayRegion’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1763: error: ‘buf’ was not declared in this scope
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::SetLongArrayRegion(_jlongArray*, int, int, int)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1767: error: ‘const struct JNINativeInterface_’ has no member named ‘SetLongArrayRegion’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1767: error: ‘buf’ was not declared in this scope
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::SetFloatArrayRegion(_jfloatArray*, int, int, const jfloat*)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1771: error: ‘const struct JNINativeInterface_’ has no member named ‘SetFloatArrayRegion’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::SetDoubleArrayRegion(_jdoubleArray*, int, int, const jdouble*)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1775: error: ‘const struct JNINativeInterface_’ has no member named ‘SetDoubleArrayRegion’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::GetStringRegion(_jstring*, int, int, jchar*)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1798: error: ‘const struct JNINativeInterface_’ has no member named ‘GetStringRegion’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::GetStringUTFRegion(_jstring*, int, int, char*)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1801: error: ‘const struct JNINativeInterface_’ has no member named ‘GetStringUTFRegion’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void* JNIEnv_::GetPrimitiveArrayCritical(_jarray*, jboolean*)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1805: error: ‘const struct JNINativeInterface_’ has no member named ‘GetPrimitiveArrayCritical’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::ReleasePrimitiveArrayCritical(_jarray*, void*, int)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1808: error: ‘const struct JNINativeInterface_’ has no member named ‘ReleasePrimitiveArrayCritical’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘const jchar* JNIEnv_::GetStringCritical(_jstring*, jboolean*)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1812: error: ‘const struct JNINativeInterface_’ has no member named ‘GetStringCritical’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::ReleaseStringCritical(_jstring*, const jchar*)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1815: error: ‘const struct JNINativeInterface_’ has no member named ‘ReleaseStringCritical’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘_jobject* JNIEnv_::NewWeakGlobalRef(_jobject*)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1819: error: ‘const struct JNINativeInterface_’ has no member named ‘NewWeakGlobalRef’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void JNIEnv_::DeleteWeakGlobalRef(_jobject*)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1822: error: ‘const struct JNINativeInterface_’ has no member named ‘DeleteWeakGlobalRef’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘jboolean JNIEnv_::ExceptionCheck()’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1826: error: ‘const struct JNINativeInterface_’ has no member named ‘ExceptionCheck’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘_jobject* JNIEnv_::NewDirectByteBuffer(void*, int)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1830: error: ‘const struct JNINativeInterface_’ has no member named ‘NewDirectByteBuffer’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘void* JNIEnv_::GetDirectBufferAddress(_jobject*)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1833: error: ‘const struct JNINativeInterface_’ has no member named ‘GetDirectBufferAddress’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: In member function ‘jobjectRefType JNIEnv_::GetObjectRefType(_jobject*)’:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1839: error: ‘const struct JNINativeInterface_’ has no member named ‘GetObjectRefType’
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h: At global scope:
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1851: error: ‘jint’ does not name a type
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1853: error: ‘jint’ does not name a type
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1859: error: ‘jint’ does not name a type
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1877: error: ‘JNICALL’ has not been declared
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1877: error: ISO C++ forbids declaration of ‘jint’ with no type
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1877: error: ‘jint’ declared as function returning a function
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1879: error: ‘JNICALL’ has not been declared
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1879: error: ISO C++ forbids declaration of ‘jint’ with no type
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1879: error: ‘jint’ declared as function returning a function
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1881: error: ‘JNICALL’ has not been declared
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1881: error: ISO C++ forbids declaration of ‘jint’ with no type
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1881: error: ‘jint’ declared as function returning a function
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1883: error: ‘JNICALL’ has not been declared
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1883: error: ‘jint’ has not been declared
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1883: error: ISO C++ forbids declaration of ‘jint’ with no type
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1883: error: ‘jint’ declared as function returning a function
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1885: error: ‘JNICALL’ has not been declared
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1885: error: ISO C++ forbids declaration of ‘jint’ with no type
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1885: error: ‘jint’ declared as function returning a function
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1892: error: ‘jint’ does not name a type
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1895: error: ‘jint’ does not name a type
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1898: error: ‘jint’ does not name a type
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1902: error: ‘jint’ does not name a type
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1905: error: ‘jint’ does not name a type
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1916: error: ‘JNIIMPORT’ does not name a type
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1919: error: ‘JNIIMPORT’ does not name a type
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1922: error: ‘JNIIMPORT’ does not name a type
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1926: error: ‘JNIEXPORT’ does not name a type
/usr/lib/jvm/jdk1.6.0_34-x86/include/jni.h:1929: error: expected constructor, destructor, or type conversion before ‘void’
2013-03-21-1356-Hello-GCC-Ex.cpp: In function ‘int main()’:
2013-03-21-1356-Hello-GCC-Ex.cpp:19: error: ‘JDK1_1InitArgs’ was not declared in this scope
2013-03-21-1356-Hello-GCC-Ex.cpp:19: error: expected ‘;’ before ‘vm_args’
2013-03-21-1356-Hello-GCC-Ex.cpp:20: error: ‘vm_args’ was not declared in this scope
2013-03-21-1356-Hello-GCC-Ex.cpp:23: error: ‘JNI_GetDefaultJavaVMInitArgs’ was not declared in this scope
2013-03-21-1356-Hello-GCC-Ex.cpp:27: error: ‘JNI_CreateJavaVM’ was not declared in this scope
2013-03-21-1356-Hello-GCC-Ex.cpp:34: error: ‘struct JavaVM_’ has no member named ‘DestroyJavaVM’

========================

More Information:

I have tried this with eclipse, by creating creating an executable empty gcc project, creating my hello world code, and it works fine.

After that, I added the jni code, and imported the source by:

Right click project -> properties -> C/C++ General -> Paths and Symbols -> Includes -> GNU C++ -> Add ->

then adding the directory that contains the jni.h

When I try to build it this way, in eclipse, I get the exact same errors.

Also, I'm running on Ubuntu 10 64bit...

========================

Can someone help?

It could be a very simple importing problem, but I'm not sure

========================

UPDATE 1

Running:

g++ -I /usr/lib/jvm/jdk1.7.0_06/include/ -I /usr/lib/jvm/jdk1.7.0_06/include/linux/ Hello.cpp

Gives me:

Hello.cpp: In function ‘int main()’:
Hello.cpp:19: error: ‘JDK1_1InitArgs’ was not declared in this scope
Hello.cpp:19: error: expected ‘;’ before ‘vm_args’
Hello.cpp:20: error: ‘vm_args’ was not declared in this scope

========================

UPDATE 2

Apparently JDK1_1InitArgs was removed in JDK 6, so I compiled with the JDK 5 jni.h like this:

g++ -I /usr/lib/jvm/jdk1.5.0_22-x86/include/ -I /usr/lib/jvm/jdk1.5.0_22-x86/include/linux/ Hello.cpp

and it gives me:

Hello.cpp: In function ‘int main()’:
Hello.cpp:24: warning: deprecated conversion from string constant to ‘char*’
Hello.cpp:27: error: invalid conversion from ‘JNIEnv**’ to ‘void**’
Hello.cpp:27: error:   initializing argument 2 of ‘jint JNI_CreateJavaVM(JavaVM**, void**, void*)’

========================

UPDATE 3

I've been doing some research and possible solutions are:

  1. Add -L/usr/X11R6/lib, or where-ever the X11 libraries are, to the g++ command... had no effect.
  2. Add the paths of ibhpi.so and libjvm.so to the LD_LIBRARY_PATH (for me it's at /usr/lib/jvm/jdk1.5.0_22-x86/jre/lib/i386/native_threads/)... had no effect
  3. Add libjava.so to the LD_LIBRARY_PATH as well (mine is at /usr/lib/jvm/jdk1.5.0_22-x86/jre/lib/i386/)... had no effect
  4. Add jre/lib to the LD_LIBRARY_PATH... had no effect

One of my final build commands (still not working, though)

g++ -g 
-I /usr/lib/jvm/jdk1.5.0_22-x86/include/ 
-I /usr/lib/jvm/jdk1.5.0_22-x86/include/linux/  
-L/usr/lib/jvm/jdk1.5.0_22-x86/jre/lib/i386/ 
Hello.cpp

ERROR:

Hello.cpp:23: undefined reference to `JNI_GetDefaultJavaVMInitArgs'
Hello.cpp:27: undefined reference to `JNI_CreateJavaVM'

I changed &env to (void**)&env, suggested by ldav1s to get rid of the void star error

========================

UPDATE 4

I believe the problem is that I am trying to load libraries not built for my system?...

My current command is:

g++  
-L/usr/lib/jvm/jdk1.5.0_22-x86/lib 
-L/usr/lib/jvm/jdk1.5.0_22-x86/jre/lib 
-L/usr/lib/jvm/jdk1.5.0_22-x86/jre/lib/i386 -ljava
-L/usr/lib/jvm/jdk1.5.0_22-x86/jre/lib/i386/native_threads -lhpi 
-L/usr/lib/jvm/jdk1.5.0_22-x86/jre/lib/i386/server -ljvm
-I /usr/lib/jvm/jdk1.5.0_22-x86/include/ 
-I /usr/lib/jvm/jdk1.5.0_22-x86/include/linux/
Hello.cpp 

and am getting:

...
/usr/bin/ld: skipping incompatible /usr/lib/jvm/jdk1.5.0_22-x86/jre/lib/i386/libjava.so when searching for -ljava
/usr/bin/ld: skipping incompatible /usr/lib/jvm/jdk1.5.0_22-x86/jre/lib/i386/native_threads/libhpi.so when searching for -lhpi
/usr/bin/ld: skipping incompatible /usr/lib/jvm/jdk1.5.0_22-x86/jre/lib/i386/server/libjvm.so when searching for -ljvm
/usr/bin/ld: cannot find -ljava
/usr/bin/ld: cannot find -lhpi
/usr/bin/ld: cannot find -ljvm
...

========================

UPDATE 5 / SOLUTION

Took me a while, but this gives me the least number of errors!

g++ -fPIC 
-L/usr/lib/jvm/java-6-openjdk/jre/lib 
-L/usr/lib/jvm/java-6-openjdk/jre/lib/amd64 -ljava -lverify 
-L/usr/lib/jvm/java-6-openjdk/jre/lib/amd64/native_threads -lhpi 
-L/usr/lib/jvm/java-6-openjdk/jre/lib/amd64/server -ljvm 
-I /usr/lib/jvm/jdk1.5.0_22-x86/include/ 
-I /usr/lib/jvm/jdk1.5.0_22-x86/include/linux/ 
Hello.cpp

Warnings:

Hello.cpp: In function ‘int main()’:
Hello.cpp:24: warning: deprecated conversion from string constant to ‘char*

Note: before running remember to add the amd libs to LD_LIBRARY_PATH:

$ export LD_LIBRARY_PATH=/usr/lib/jvm/java-6-openjdk/jre/lib/amd64:$LD_LIBRARY_PATH
$ export LD_LIBRARY_PATH=/usr/lib/jvm/java-6-openjdk/jre/lib/amd64/native_threads:$LD_LIBRARY_PATH
$ export LD_LIBRARY_PATH=/usr/lib/jvm/java-6-openjdk/jre/lib/amd64/server:$LD_LIBRARY_PATH
$ export LD_LIBRARY_PATH=/usr/lib/jvm/java-6-openjdk/jre/lib:$LD_LIBRARY_PATH

THANKS!

解决方案

Usually you have to add some kind of platform specific directory as well like on Linux:

g++ -I /usr/lib/jvm/jdk1.6.0_34-x86/include/ -I /usr/lib/jvm/jdk1.6.0_34-x86/include/linux Hello.cpp

because a few macros (like JNICALL) are set up there. Hopefully that'll fix the jni.h error cascade.

EDIT: Still stuck? Try:

JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);

It'll at least get past the compilation problem. I don't know if it'll work, since I've not tried this before.

这篇关于使用JNI从C ++程序中执行一个java jar,使用g ++或eclipse的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆