Bhu*_*tap 15 java-native-interface android android-ndk
伙计们,
我正在开发一个Android应用程序,我需要第三方.so库.我根据他们的指示构建了这个第三方库(使用ndk-build),然后将其包含在我的Android项目中.
因此,我按照docs/PREBUILTS.html中描述的步骤操作,并在jni/prebuilt目录中成功构建新的.so.现在我尝试在一个简单的测试Android应用程序中使用它来利用.so工具.所以我做的是:
static {
Log.i("load so > ","load so");
System.loadLibrary("xyz");
}
/* The native functions */
private static native int openFile(String filename);
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try{
String path = getPathForDownloadDirectoryFile();
Log.i("file path> ", path);
int num= openFile(path);
}catch(Exception e){
Log.e(">", "could not open the file");
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当我运行我的应用程序时,我收到一条调试消息:在/data/data/com.example.myfirstapp/lib/xyz.so 0x411e6738中找不到JNI_OnLoad,跳过init然后应用程序关闭.
有关详细信息,请参阅以下错误日志:
No JNI_OnLoad found in /data/data/com.example.mysecondapp/lib/xyz.so 0x411e67a0, skipping init
W/dalvikvm( 570): No implementation found for native Lcom/example/mysecondapp/MainActivity;.openFile:(Ljava/lang/String;)I
D/AndroidRuntime( 570): Shutting down VM
W/dalvikvm( 570): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
E/AndroidRuntime( 570): FATAL EXCEPTION: main
E/AndroidRuntime( 570): java.lang.UnsatisfiedLinkError: Native method not found: com.example.mysecondapp.MainActivity.openFile:(Ljava/lang/String;)I
E/AndroidRuntime( 570): at com.example.mysecondapp.MainActivity.openFile(Native Method)
E/AndroidRuntime( 570): at com.example.mysecondapp.MainActivity.onCreate(MainActivity.java:31)
E/AndroidRuntime( 570): at android.app.Activity.performCreate(Activity.java:5008)
E/AndroidRuntime( 570): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
E/AndroidRuntime( 570): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
E/AndroidRuntime( 570): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
E/AndroidRuntime( 570): at android.app.ActivityThread.access$600(ActivityThread.java:130)
E/AndroidRuntime( 570): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
E/AndroidRuntime( 570): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 570): at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime( 570): at android.app.ActivityThread.main(ActivityThread.java:4745)
E/AndroidRuntime( 570): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 570): at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime( 570): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
E/AndroidRuntime( 570): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
E/AndroidRuntime( 570): at dalvik.system.NativeStart.main(Native Method)
W/ActivityManager( 146): Force finishing activity com.example.mysecondapp/.MainActivity
Run Code Online (Sandbox Code Playgroud)
正如我所看到的那样,找不到openFile()方法的原生实现,但是同样的xyz.so lib与来自第三方的原始示例应用程序相当整齐.我几乎是Android-ndk世界的首发.
Java-Android-NDK Ninjas ..猜测我可能会缺少什么?我非常感谢这里的任何帮助:)
Sun*_*tya 17
正如guycole所说"没有JNI_OnLoad"只是一个警告,你的问题就在其他地方.
正如您所提到的,您成功编译了"so"文件,问题可能出在您的c/C++代码中的函数签名中,它应该是这样的
JNIEXPORT jint JNICALL Java_com_your_package_class_method(JNIEnv *d, jobject e, jstring f)
{
//some action
}
Run Code Online (Sandbox Code Playgroud)
函数签名来自使用javah工具生成的头文件.您需要生成头文件并将函数签名与您的包名一起使用.对于不同的包和类名,头文件和相应的函数签名将更改.
worked pretty neat with the original sample app from the third party
Run Code Online (Sandbox Code Playgroud)
这可能是它在示例应用程序上而不是在您的应用程序上运行的原因.
参考:https://thenewcircle.com/s/post/49/using_ndk_to_call_c_code_from_android_apps
小智 6
"No JNI_OnLoad"消息只是一个警告.JNI_OnLoad是一个可选的初始化钩子.
我想你的问题在openFile()方法中.尝试用Java注释掉调用,看看你得到了多少.
我有一篇关于JNI的博客文章和http://guycole.blogspot.com/2012/03/yet-another-android-ndk-blog-posting.html上的一些示例代码- 也许你会发现它很有用.
祝好运.
| 归档时间: |
|
| 查看次数: |
30407 次 |
| 最近记录: |