有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在Windows Android Studio中获取错误消息“error:(16)未定义对'JNI_CreateJavaVM'的引用”

我试图使用C文件在Java类中调用define方法。我用JNI来做这个。我是李女士。调用java类中的方法的C文件:

#include <stdio.h>
 #include<jni.h>


 JNIEnv* create_vm(JavaVM **jvm)
 {
     JNIEnv* env;
     JavaVMInitArgs args;
     JavaVMOption options;
     args.version = JNI_VERSION_1_6;
     args.nOptions = 1;
     options.optionString = "-Djava.class.path=./";
     args.options = &options;
     args.ignoreUnrecognized = 0;
     int rv;
     rv = JNI_CreateJavaVM(&jvm, (void**)&env, &args);

     if (rv < 0 || !env)
         printf("Unable to Launch JVM %d\n",rv);
     else
         printf("Launched JVM! :)\n");
     return env;
 }

 void invoke_class(JNIEnv* env)
 {
     jclass hello_world_class;
     jmethodID square_method;
     jint number=20;
     hello_world_class = (*env)->FindClass(env, "MainActivity");
     square_method = (*env)->GetStaticMethodID(env, hello_world_class, "square", "(I)I");
     printf("%d squared is %d\n", number,
         (*env)->CallStaticIntMethod(env, hello_world_class, square_method, number));
 }


 int main(int argc, char **argv)
 {
     JavaVM *jvm;
     JNIEnv *env;
     env = create_vm(&jvm);
     if(env == NULL)
         return 1;
     invoke_class(env);
     return 0;
 }

当我尝试构建项目时,它总是让我出错

C:\Projects\AndroidProjects\NDKSample\app\src\main\jni\test.c Error:(16) undefined reference to 'JNI_CreateJavaVM' Error:error: ld returned 1 exit status make.exe: *** [C:/Projects/AndroidProjects/NDKSample/app/src/main/obj/local/armeabi/libMyLib.so] Error 1 make.exe: Leaving directory `C:/Projects/AndroidProjects/NDKSample/app/src/main/jni' :app:ndkBuild FAILED Error:Execution failed for task ':app:ndkBuild'.

Process 'command 'C:\Users\mmjoshi\AppData\Local\Android\ndk\ndk-build.cmd'' finished with non-zero exit value 2

请让我知道,我如何解决这个错误请注意,我正在Windows 7的Android Studio中尝试此功能

以下是我的Graddle文件,仅供参考:

import org.apache.tools.ant.taskdefs.condition.Os

apply plugin: 'com.安卓.application'


安卓 {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    defaultConfig {
        applicationId "einfo.ndksample"
        minSdkVersion 15
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"

        ndk {
            moduleName "MyLib"
        }
    }
    sourceSets.main {
        jniLibs.srcDir 'src/main/libs'
        jni.srcDirs = [] //disable automatic ndk-build call
    }

    project.ext.versionCodes = ['armeabi':1, 'armeabi-v7a':2, 'arm64-v8a':3, 'mips':5, 'mips64':6, 'x86':8, 'x86_64':9] //versionCode digit for each supported ABI, with 64bit>32bit and x86>armeabi-*

    安卓.applicationVariants.all { variant ->
        // assign different version code for each output
        variant.outputs.each { output ->
            output.versionCodeOverride =
                    project.ext.versionCodes.get(output.getFilter(com.安卓.build.OutputFile.ABI), 0) * 1000000 + defaultConfig.versionCode
        }
    }

    task ndkBuild(type: Exec) {
        if (Os.isFamily(Os.FAMILY_WINDOWS)) {
            def ndkDir = 安卓.ndkDirectory.getAbsolutePath()

            commandLine ndkDir + '\\' + 'ndk-build.cmd', '-C', file('src/main/jni').absolutePath
        } else {
            commandLine 'ndk-build', '-C', file('src/main/jni').absolutePath
        }
    }


    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn ndkBuild
    }
        buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-安卓.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.安卓.support:appcompat-v7:22.2.0'
}

提前谢谢


共 (1) 个答案

  1. # 1 楼答案

    在Android上,您无法从C创建Java虚拟机。但没有必要这样做:您的应用程序已经在JVM中运行,您的本机代码不需要int main()入口点。相反,它被编译到一个共享库(类似于Android的DLL)中,并从Java加载(通常从具有本机方法的类的静态构造函数加载)

    Android确实支持从C到Java的调用(通过FindClass和CallStaticMethod及其kin),但JNIEnv* env是在Java调用中接收的,而不是在C中创建的