使用android JNI

时间:2017-02-28 20:39:11

标签: java android c java-native-interface

我在Gitgub中使用了一个开源项目。
我必须更改它的包名。
archArm.c函数代码源的主要部分是:

 jstring
  Java_com_github_hiteshsondhi88_libffmpeg_ArmArchHelper_cpuArchFromJNI(JNIEnv* env, jobject obj)


主ArchArmHelper.java是:

package com.github.hiteshsondhi88.libffmpeg;

class ArmArchHelper {
static {
    System.loadLibrary("ARM_ARCH");
}

native String cpuArchFromJNI();

boolean isARM_v7_CPU(String cpuInfoString) {
    return cpuInfoString.contains("v7");
}

boolean isNeonSupported(String cpuInfoString) {
    // check cpu arch for loading correct ffmpeg lib
    return cpuInfoString.contains("-neon");
 }
}


现在我将archArm.c函数的一部分编辑为:

 jstring 
 Java_com_emad_amerian_libffmpeg_ArmArchHelper_cpuArchFromJNI(JNIEnv* env, jobject obj)

我将ArchArmHelper.java编辑为:

package com.emad.amerian.libffmpeg;
class ArmArchHelper {
static {
    System.loadLibrary("ARM_ARCH");
}

native String cpuArchFromJNI();

boolean isARM_v7_CPU(String cpuInfoString) {
    return cpuInfoString.contains("v7");
}

boolean isNeonSupported(String cpuInfoString) {
    // check cpu arch for loading correct ffmpeg lib
    return cpuInfoString.contains("-neon");
 }
}


我可以成功构建我的APK文件,但在运行时启动我的项目返回错误:

02-28 23:29:20.001 15094-15094/com.emad.amerian.sampleffmpeg E/art: No   implementation found for java.lang.String   com.emad.amerian.libffmpeg.ArmArchHelper.cpuArchFromJNI() (tried   Java_com_emad_amerian_libffmpeg_ArmArchHelper_cpuArchFromJNI and Java_com_emad_amerian_libffmpeg_ArmArchHelper_cpuArchFromJNI__)

1 个答案:

答案 0 :(得分:0)

您需要使用JNIEXPORT和JNICALL宏导出该函数:

JNIEXPORT jstring JNICALL Java_com_emad_amerian_libffmpeg_ArmArchHelper_cpuArchFromJNI(JNIEnv* env, jobject obj)

这使得函数在库的符号表中可见,以便Java VM可以链接它。