java - 使用安卓 JNI

标签 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__)

最佳答案

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

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

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

关于java - 使用安卓 JNI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42518299/

相关文章:

android - Realm executeTransactionAsync 是否关闭实例

c - pow() 是否适用于 C 中的 int 数据类型?

C: "Conflicting types for ..."错误

c# - Xamarin C# 安卓 : change color text in a substring?

java - Android 媒体记录器 : How to add new codec in MPEG_4 or any audio format

c - fseek 不适用于空文件

java - log4j2 错误 StatusLogger 无法识别的转换说明符

java - postgres服务器拒绝连接到heroku

java - 我应该避免使用从 Java 8 开始的迭代器吗?它们还有适当的用途吗?

java - 从字符串构造枚举的映射键时发生 JSON 映射异常