3

C++プログラムからJava jarを呼び出し/実行しようとしています。

これまでに見つけたオプションは次のとおりです。

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

JNI を使用したいのですが、問題が発生しています。

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

こんにちは.cpp

私は単純な Hello.cpp クラスを持っています:

#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;
}

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

コンパイル

そして、次のようなものでコンパイルしようとすると:

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

注:そのフォルダーに「jni.h」が見つかったので、含めました。それが正しい場所だと思いますが、確かではありません

大量のエラーが発生します(以下を参照)

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

エラー

jni.h をコンパイルしようとしているかのように、jni.h から100 万のエラーが発生します。

/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’

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

詳しくは:

実行可能な空のgccプロジェクトを作成し、hello worldコードを作成することで、Eclipseでこれを試しましたが、正常に動作します。

その後、jni コードを追加し、次の方法でソースをインポートしました。

プロジェクトを右クリック -> プロパティ -> C/C++ 一般 -> パスとシンボル -> インクルード -> GNU C++ -> 追加 ->

次に、jni.h を含むディレクトリを追加します。

この方法でビルドしようとすると、Eclipse でまったく同じエラーが発生します。

また、Ubuntu 10 64ビットで実行しています...

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

誰か助けてくれませんか?

非常に単純なインポートの問題かもしれませんが、よくわかりません

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

更新 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: 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

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

更新 2

どうやら JDK1_1InitArgs は JDK 6 で削除されたので、次のように 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

そしてそれは私に与えます:

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*)’

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

更新 3

私はいくつかの調査を行ってきましたが、考えられる解決策は次のとおりです。

  1. -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. LD_LIBRARY_PATH にも libjava.so を追加します (私の場合は /usr/lib/jvm/jdk1.5.0_22-x86/jre/lib/i386/ にあります)...効果はありませんでした
  4. jre/lib を LD_LIBRARY_PATH に追加します...効果はありませんでした

最終的なビルド コマンドの 1 つ (ただし、まだ機能していません)

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: undefined reference to `JNI_GetDefaultJavaVMInitArgs'
Hello.cpp:27: undefined reference to `JNI_CreateJavaVM'

私は &env を (void**)&env に変更しました。

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

更新 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 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
...

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

アップデート 5 / ソリューション

しばらく時間がかかりましたが、これによりエラーの数が最小限に抑えられます!

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: In function ‘int main()’:
Hello.cpp:24: warning: deprecated conversion from string constant to ‘char*

注: 実行する前に、amd ライブラリを 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

ありがとう!

4

2 に答える 2